diff --git a/src/agent/Cargo.lock b/src/agent/Cargo.lock index 3bb6208e16b3..aebe1609ce12 100644 --- a/src/agent/Cargo.lock +++ b/src/agent/Cargo.lock @@ -209,12 +209,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" -[[package]] -name = "base64" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - [[package]] name = "bincode" version = "1.3.3" @@ -523,16 +517,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.3" @@ -620,6 +604,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + [[package]] name = "derivative" version = "2.2.0" @@ -728,15 +718,6 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if 1.0.0", -] - [[package]] name = "enumflags2" version = "0.7.7" @@ -850,21 +831,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.0.1" @@ -1078,72 +1044,12 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes 1.1.0", - "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.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes 1.1.0", - "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-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes 1.1.0", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "iana-time-zone" version = "0.1.46" @@ -1241,12 +1147,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - [[package]] name = "ipnetwork" version = "0.17.0" @@ -1276,6 +1176,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.2" @@ -1307,7 +1216,6 @@ dependencies = [ "futures", "h2", "hex", - "http", "ipnetwork", "kata-sys-util", "kata-types", @@ -1319,7 +1227,6 @@ dependencies = [ "netlink-sys", "nix 0.24.2", "oci", - "openssl", "opentelemetry", "proc-mounts", "procfs", @@ -1327,7 +1234,7 @@ dependencies = [ "protobuf 3.2.0", "protocols", "regex", - "reqwest", + "regorus", "rtnetlink", "rustjail", "scan_fmt", @@ -1389,7 +1296,7 @@ name = "kata-types" version = "0.1.0" dependencies = [ "anyhow", - "base64 0.13.0", + "base64", "bitmask-enum", "byte-unit", "glob", @@ -1535,9 +1442,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memoffset" @@ -1557,12 +1464,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1596,24 +1497,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "netlink-packet-core" version = "0.2.4" @@ -1752,6 +1635,20 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.4.4" @@ -1763,21 +1660,52 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-complex" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +dependencies = [ + "num-traits", +] + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", + "num-bigint", + "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -1817,60 +1745,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" -[[package]] -name = "openssl" -version = "0.10.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.16", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-src" -version = "111.27.0+1.1.1v" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - [[package]] name = "opentelemetry" version = "0.14.0" @@ -2118,9 +1992,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.58" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -2184,7 +2058,7 @@ checksum = "355f634b43cdd80724ee7848f95770e7e70eefa6dcf14fea676216573b8fd603" dependencies = [ "bytes 1.1.0", "heck 0.3.3", - "itertools", + "itertools 0.10.3", "log", "multimap", "petgraph", @@ -2201,7 +2075,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "600d2f334aa05acb02a755e217ef1ab6dea4d51b58b7846588b747edec04efba" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.3", "proc-macro2", "quote", "syn 1.0.109", @@ -2357,14 +2231,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.4" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.7", - "regex-syntax 0.7.5", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] @@ -2378,13 +2252,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.7" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax 0.8.3", ] [[package]] @@ -2395,54 +2269,34 @@ checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +name = "regorus" +version = "0.1.4" +source = "git+https://github.com/anakrish/regorus?rev=fc6f5d4#fc6f5d41dea3b466afd52fca8bf28ed6d7c04b29" dependencies = [ - "winapi", + "anyhow", + "data-encoding", + "itertools 0.12.1", + "lazy_static", + "num", + "rand", + "regex", + "scientific", + "serde", + "serde_json", ] [[package]] -name = "reqwest" -version = "0.11.18" +name = "remove_dir_all" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "base64 0.21.2", - "bytes 1.1.0", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", + "winapi", ] [[package]] @@ -2579,42 +2433,30 @@ dependencies = [ ] [[package]] -name = "schannel" -version = "0.1.22" +name = "scientific" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "dc53198b8e237c451c68dba8411a1f8bd92787657689f24d67ae3d6b98c39f59" dependencies = [ - "windows-sys 0.48.0", + "scientific-macro", ] [[package]] -name = "scopeguard" -version = "1.1.0" +name = "scientific-macro" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "d2ee4885492bb655bfa05d039cd9163eb8fe9f79ddebf00ca23a1637510c2fd2" dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", + "proc-macro2", + "quote", + "syn 2.0.16", ] [[package]] -name = "security-framework-sys" -version = "2.9.1" +name = "scopeguard" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" @@ -2624,9 +2466,9 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] @@ -2681,20 +2523,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.16", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" dependencies = [ "itoa", "ryu", @@ -2712,18 +2554,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "serial_test" version = "0.5.1" @@ -3128,16 +2958,6 @@ dependencies = [ "syn 2.0.16", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-stream" version = "0.1.9" @@ -3199,12 +3019,6 @@ dependencies = [ "serde", ] -[[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" @@ -3294,12 +3108,6 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - [[package]] name = "ttrpc" version = "0.7.1" @@ -3415,12 +3223,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "verity" version = "0.1.0" @@ -3479,15 +3281,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" @@ -3525,18 +3318,6 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" version = "0.2.81" @@ -3566,16 +3347,6 @@ version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" -[[package]] -name = "web-sys" -version = "0.3.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "wepoll-ffi" version = "0.1.2" @@ -3868,15 +3639,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - [[package]] name = "xattr" version = "0.2.3" diff --git a/src/agent/Cargo.toml b/src/agent/Cargo.toml index a4841c961630..0dd91ffd301f 100644 --- a/src/agent/Cargo.toml +++ b/src/agent/Cargo.toml @@ -19,7 +19,7 @@ serde_json = "1.0.39" scan_fmt = "0.2.3" scopeguard = "1.0.0" thiserror = "1.0.26" -regex = "1.5.6" +regex = "1.10.4" serial_test = "0.5.1" kata-sys-util = { path = "../libs/kata-sys-util" } kata-types = { path = "../libs/kata-types" } @@ -60,7 +60,14 @@ log = "0.4.11" cfg-if = "1.0.0" prometheus = { version = "0.13.0", features = ["process"] } procfs = "0.12.0" -anyhow = "1.0.32" + +# anyhow is currently locked at 1.0.58 because: +# - Versions between 1.0.59 - 1.0.76 have not been tested yet using Kata CI. +# However, those versions are passing "make test" for the Kata Agent. +# - Versions 1.0.77 or newer fail during "make test" - see +# https://github.com/kata-containers/kata-containers/issues/9538 +anyhow = "=1.0.58" + cgroups = { package = "cgroups-rs", version = "0.3.3" } # Tracing @@ -75,17 +82,15 @@ serde = { version = "1.0.129", features = ["derive"] } toml = "0.5.8" clap = { version = "3.0.1", features = ["derive"] } -# Communication with the OPA service -http = { version = "0.2.8", optional = true } -reqwest = { version = "0.11.14", optional = true } -# The "vendored" feature for openssl is required for musl build -openssl = { version = "0.10.54", features = ["vendored"], optional = true } - # Policy validation sha2 = { version = "0.10.6", optional = true } hex = { version = "0.4.2", optional = true } sev = { git = "https://github.com/virtee/sev", version = "1.2", default-features = false, features = ["snp"], optional = true } +# Agent Policy +# TODO: use regorus version 0.1.5 when it will be released to crates.io. +regorus = { git = "https://github.com/anakrish/regorus", rev = "fc6f5d4", default-features = false, features = ["arc", "base64", "base64url", "regex"], optional = true } + [dev-dependencies] tempfile = "3.1.0" test-utils = { path = "../libs/test-utils" } @@ -103,7 +108,7 @@ lto = true default = [] seccomp = ["rustjail/seccomp"] standard-oci-runtime = ["rustjail/standard-oci-runtime"] -agent-policy = ["hex", "http", "openssl", "reqwest", "sev", "sha2"] +agent-policy = ["hex", "regorus", "sev", "sha2"] [[bin]] name = "kata-agent" diff --git a/src/agent/samples/policy/yaml/pod/pod-spark.yaml b/src/agent/samples/policy/yaml/pod/pod-spark.yaml index 089bc2baf2cd..974bb6ede03c 100644 --- a/src/agent/samples/policy/yaml/pod/pod-spark.yaml +++ b/src/agent/samples/policy/yaml/pod/pod-spark.yaml @@ -7,7 +7,7 @@ metadata: io.katacontainers.config.agent.policy: IyBDb3B5cmlnaHQgKGMpIDIwMjMgTWljcm9zb2Z0IENvcnBvcmF0aW9uCiMKIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAojCnBhY2thZ2UgYWdlbnRfcG9saWN5CgppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCmltcG9ydCBmdXR1cmUua2V5d29yZHMuZXZlcnkKCmltcG9ydCBpbnB1dAoKIyBEZWZhdWx0IHZhbHVlcywgcmV0dXJuZWQgYnkgT1BBIHdoZW4gcnVsZXMgY2Fubm90IGJlIGV2YWx1YXRlZCB0byB0cnVlLgpkZWZhdWx0IEFkZEFSUE5laWdoYm9yc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBBZGRTd2FwUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENsb3NlU3RkaW5SZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ29weUZpbGVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgRGVzdHJveVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBFeGVjUHJvY2Vzc1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBHZXRPT01FdmVudFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEd1ZXN0RGV0YWlsc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IExpc3RJbnRlcmZhY2VzUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IExpc3RSb3V0ZXNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgTWVtSG90cGx1Z0J5UHJvYmVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgT25saW5lQ1BVTWVtUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgUGF1c2VDb250YWluZXJSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVhZFN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXNlZWRSYW5kb21EZXZSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgUmVzdW1lQ29udGFpbmVyUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNldEd1ZXN0RGF0ZVRpbWVSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgU2V0UG9saWN5UmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFNpZ25hbFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdGFydENvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0YXJ0VHJhY2luZ1JlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBTdGF0c0NvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0b3BUcmFjaW5nUmVxdWVzdCA6PSBmYWxzZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gZmFsc2UKZGVmYXVsdCBVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IDo9IGZhbHNlCmRlZmF1bHQgVXBkYXRlSW50ZXJmYWNlUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgVXBkYXRlUm91dGVzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV2FpdFByb2Nlc3NSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBXcml0ZVN0cmVhbVJlcXVlc3QgOj0gZmFsc2UKCiMgQWxsb3dSZXF1ZXN0c0ZhaWxpbmdQb2xpY3kgOj0gdHJ1ZSBjb25maWd1cmVzIHRoZSBBZ2VudCB0byAqYWxsb3cgYW55CiMgcmVxdWVzdHMgY2F1c2luZyBhIHBvbGljeSBmYWlsdXJlKi4gVGhpcyBpcyBhbiB1bnNlY3VyZSBjb25maWd1cmF0aW9uCiMgYnV0IGlzIHVzZWZ1bCBmb3IgYWxsb3dpbmcgdW5zZWN1cmUgcG9kcyB0byBzdGFydCwgdGhlbiBjb25uZWN0IHRvCiMgdGhlbSBhbmQgaW5zcGVjdCBPUEEgbG9ncyBmb3IgdGhlIHJvb3QgY2F1c2Ugb2YgYSBmYWlsdXJlLgpkZWZhdWx0IEFsbG93UmVxdWVzdHNGYWlsaW5nUG9saWN5IDo9IGZhbHNlCgpDcmVhdGVDb250YWluZXJSZXF1ZXN0IHsKICAgIGlfb2NpIDo9IGlucHV0Lk9DSQogICAgaV9zdG9yYWdlcyA6PSBpbnB1dC5zdG9yYWdlcwoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBpX29jaS5Ib29rcyA9IiwgaV9vY2kuSG9va3MpCiAgICBpc19udWxsKGlfb2NpLkhvb2tzKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiBpX29jaS5MaW51eC5TZWNjb21wID0iLCBpX29jaS5MaW51eC5TZWNjb21wKQogICAgaXNfbnVsbChpX29jaS5MaW51eC5TZWNjb21wKQoKICAgIHNvbWUgcF9jb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgcHJpbnQoIj09PT09PT09IENyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHRyeWluZyBuZXh0IHBvbGljeSBjb250YWluZXIiKQoKICAgIHBfcGlkbnMgOj0gcF9jb250YWluZXIuc2FuZGJveF9waWRucwogICAgaV9waWRucyA6PSBpbnB1dC5zYW5kYm94X3BpZG5zCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcF9waWRucyA9IiwgcF9waWRucywgImlfcGlkbnMgPSIsIGlfcGlkbnMpCiAgICBwX3BpZG5zID09IGlfcGlkbnMKCiAgICBwX29jaSA6PSBwX2NvbnRhaW5lci5PQ0kKCiAgICBwcmludCgiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdDogcCBWZXJzaW9uID0iLCBwX29jaS5WZXJzaW9uLCAiaSBWZXJzaW9uID0iLCBpX29jaS5WZXJzaW9uKQogICAgcF9vY2kuVmVyc2lvbiA9PSBpX29jaS5WZXJzaW9uCgogICAgcHJpbnQoIkNyZWF0ZUNvbnRhaW5lclJlcXVlc3Q6IHAgUmVhZG9ubHkgPSIsIHBfb2NpLlJvb3QuUmVhZG9ubHksICJpIFJlYWRvbmx5ID0iLCBpX29jaS5Sb290LlJlYWRvbmx5KQogICAgcF9vY2kuUm9vdC5SZWFkb25seSA9PSBpX29jaS5Sb290LlJlYWRvbmx5CgogICAgYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpCgogICAgcF9zdG9yYWdlcyA6PSBwX2NvbnRhaW5lci5zdG9yYWdlcwogICAgYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpCgogICAgYWxsb3dfbGludXgocF9vY2ksIGlfb2NpKQoKICAgIHByaW50KCJDcmVhdGVDb250YWluZXJSZXF1ZXN0OiB0cnVlIikKfQoKIyBSZWplY3QgdW5leHBlY3RlZCBhbm5vdGF0aW9ucy4KYWxsb3dfYW5ubyhwX29jaSwgaV9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vIDE6IHN0YXJ0IikKCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnMKCiAgICBwcmludCgiYWxsb3dfYW5ubyAxOiB0cnVlIikKfQphbGxvd19hbm5vKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X2Fubm8gMjogcCBBbm5vdGF0aW9ucyA9IiwgcF9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIEFubm90YXRpb25zID0iLCBpX29jaS5Bbm5vdGF0aW9ucykKCiAgICBpX2tleXMgOj0gb2JqZWN0LmtleXMoaV9vY2kuQW5ub3RhdGlvbnMpCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiBpIGtleXMgPSIsIGlfa2V5cykKCiAgICBldmVyeSBpX2tleSBpbiBpX2tleXMgewogICAgICAgIGFsbG93X2Fubm9fa2V5KGlfa2V5LCBwX29jaSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfYW5ubyAyOiB0cnVlIikKfQoKYWxsb3dfYW5ub19rZXkoaV9rZXksIHBfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMTogaSBrZXkgPSIsIGlfa2V5KQoKICAgIHN0YXJ0c3dpdGgoaV9rZXksICJpby5rdWJlcm5ldGVzLmNyaS4iKQoKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAxOiB0cnVlIikKfQphbGxvd19hbm5vX2tleShpX2tleSwgcF9vY2kpIHsKICAgIHByaW50KCJhbGxvd19hbm5vX2tleSAyOiBpIGtleSA9IiwgaV9rZXkpCgogICAgc29tZSBwX2tleSwgXyBpbiBwX29jaS5Bbm5vdGF0aW9ucwogICAgcF9rZXkgPT0gaV9rZXkKCiAgICBwcmludCgiYWxsb3dfYW5ub19rZXkgMjogdHJ1ZSIpCn0KCiMgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIgYW5ub3RhdGlvbiBhbmQKIyBjb3JyZWxhdGUgaXQgd2l0aCBvdGhlciBhbm5vdGF0aW9ucyBhbmQgcHJvY2VzcyBmaWVsZHMuCmFsbG93X2J5X2Fubm8ocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzKSB7CiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiBzdGFydCIpCgogICAgc19uYW1lIDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWUiCgogICAgbm90IHBfb2NpLkFubm90YXRpb25zW3NfbmFtZV0KCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVdCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAxOiBpX3NfbmFtZSA9IiwgaV9zX25hbWUpCgogICAgYWxsb3dfYnlfc2FuZGJveF9uYW1lKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcywgaV9zX25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X2Fubm8gMTogdHJ1ZSIpCn0KYWxsb3dfYnlfYW5ubyhwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHN0YXJ0IikKCiAgICBzX25hbWUgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSIKCiAgICBwX3NfbmFtZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVdCiAgICBpX3NfbmFtZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVdCiAgICBwcmludCgiYWxsb3dfYnlfYW5ubyAyOiBpX3NfbmFtZSA9IiwgaV9zX25hbWUsICJwX3NfbmFtZSA9IiwgcF9zX25hbWUpCgogICAgYWxsb3dfc2FuZGJveF9uYW1lKHBfc19uYW1lLCBpX3NfbmFtZSkKICAgIGFsbG93X2J5X3NhbmRib3hfbmFtZShwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMsIGlfc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19ieV9hbm5vIDI6IHRydWUiKQp9CgphbGxvd19ieV9zYW5kYm94X25hbWUocF9vY2ksIGlfb2NpLCBwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IHN0YXJ0IikKCiAgICBzX25hbWVzcGFjZSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiCgogICAgcF9uYW1lc3BhY2UgOj0gcF9vY2kuQW5ub3RhdGlvbnNbc19uYW1lc3BhY2VdCiAgICBpX25hbWVzcGFjZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tzX25hbWVzcGFjZV0KICAgIHByaW50KCJhbGxvd19ieV9zYW5kYm94X25hbWU6IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKICAgIHBfbmFtZXNwYWNlID09IGlfbmFtZXNwYWNlCgogICAgYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBfb2NpLCBpX29jaSwgc19uYW1lLCBwX25hbWVzcGFjZSkKICAgIGFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkKHBfb2NpLCBpX29jaSwgcF9zdG9yYWdlcywgaV9zdG9yYWdlcykKICAgIGFsbG93X3Byb2Nlc3MocF9vY2ksIGlfb2NpLCBzX25hbWUpCgogICAgcHJpbnQoImFsbG93X2J5X3NhbmRib3hfbmFtZTogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfbmFtZShwX3NfbmFtZSwgaV9zX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMTogc3RhcnQiKQoKICAgIHBfc19uYW1lID09IGlfc19uYW1lCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmFtZSAxOiB0cnVlIikKfQphbGxvd19zYW5kYm94X25hbWUocF9zX25hbWUsIGlfc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uYW1lIDI6IHN0YXJ0IikKCiAgICAjIFRPRE86IHNob3VsZCBnZW5lcmF0ZWQgbmFtZXMgYmUgaGFuZGxlZCBkaWZmZXJlbnRseT8KICAgIGNvbnRhaW5zKHBfc19uYW1lLCAiJChnZW5lcmF0ZWQtbmFtZSkiKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X25hbWUgMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhhdCB0aGUgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci10eXBlIiBhbmQKIyAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSIgYW5ub3RhdGlvbnMgZGVzaWduYXRlIHRoZQojIGV4cGVjdGVkIHR5cGUgLSBlaXRoZXIgYSAic2FuZGJveCIgb3IgYSAiY29udGFpbmVyIi4gVGhlbiwgdmFsaWRhdGUKIyBvdGhlciBhbm5vdGF0aW9ucyBiYXNlZCBvbiB0aGUgYWN0dWFsICJzYW5kYm94IiBvciAiY29udGFpbmVyIiB2YWx1ZQojIGZyb20gdGhlIGlucHV0IGNvbnRhaW5lci4KYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzKHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkgewogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlczogY2hlY2tpbmcgaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiKQoKICAgIGNfdHlwZSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLXR5cGUiCiAgICAKICAgIHBfY3JpX3R5cGUgOj0gcF9vY2kuQW5ub3RhdGlvbnNbY190eXBlXQogICAgaV9jcmlfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1tjX3R5cGVdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiBwX2NyaV90eXBlID0iLCBwX2NyaV90eXBlLCAiaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIHBfY3JpX3R5cGUgPT0gaV9jcmlfdHlwZQoKICAgIGFsbG93X2J5X2NvbnRhaW5lcl90eXBlKGlfY3JpX3R5cGUsIHBfb2NpLCBpX29jaSwgc19uYW1lLCBzX25hbWVzcGFjZSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGVzOiB0cnVlIikKfQoKYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMTogaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIGlfY3JpX3R5cGUgPT0gInNhbmRib3giCgogICAgaV9rYXRhX3R5cGUgOj0gaV9vY2kuQW5ub3RhdGlvbnNbImlvLmthdGFjb250YWluZXJzLnBrZy5vY2kuY29udGFpbmVyX3R5cGUiXQogICAgcHJpbnQoImFsbG93X2J5X2NvbnRhaW5lcl90eXBlIDE6IGlfa2F0YV90eXBlID0iLCBpX2thdGFfdHlwZSkKICAgIGlfa2F0YV90eXBlID09ICJwb2Rfc2FuZGJveCIKCiAgICBhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKQoKICAgIHByaW50KCJhbGxvd19ieV9jb250YWluZXJfdHlwZSAxOiB0cnVlIikKfQoKYWxsb3dfYnlfY29udGFpbmVyX3R5cGUoaV9jcmlfdHlwZSwgcF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogaV9jcmlfdHlwZSA9IiwgaV9jcmlfdHlwZSkKICAgIGlfY3JpX3R5cGUgPT0gImNvbnRhaW5lciIKCiAgICBpX2thdGFfdHlwZSA6PSBpX29jaS5Bbm5vdGF0aW9uc1siaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5jb250YWluZXJfdHlwZSJdCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogaV9rYXRhX3R5cGUgPSIsIGlfa2F0YV90eXBlKQogICAgaV9rYXRhX3R5cGUgPT0gInBvZF9jb250YWluZXIiCgogICAgYWxsb3dfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKQogICAgYWxsb3dfbmV0X25hbWVzcGFjZShwX29jaSwgaV9vY2kpCiAgICBhbGxvd19sb2dfZGlyZWN0b3J5KHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiYWxsb3dfYnlfY29udGFpbmVyX3R5cGUgMjogdHJ1ZSIpCn0KCiMgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIiBhbm5vdGF0aW9uCmFsbG93X3NhbmRib3hfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9jb250YWluZXJfbmFtZTogc3RhcnQiKQoKICAgIGNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3NpbmcocF9vY2ksIGlfb2NpLCAiaW8ua3ViZXJuZXRlcy5jcmkuY29udGFpbmVyLW5hbWUiKQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X2NvbnRhaW5lcl9uYW1lOiB0cnVlIikKfQoKYWxsb3dfY29udGFpbmVyX25hbWUocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfY29udGFpbmVyX25hbWU6IHN0YXJ0IikKCiAgICBhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbihwX29jaSwgaV9vY2ksICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItbmFtZSIpCgogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9uYW1lOiB0cnVlIikKfQoKY29udGFpbmVyX2Fubm90YXRpb25fbWlzc2luZyhwX29jaSwgaV9vY2ksIGtleSkgewogICAgcHJpbnQoImNvbnRhaW5lcl9hbm5vdGF0aW9uX21pc3Npbmc6Iiwga2V5KQoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJjb250YWluZXJfYW5ub3RhdGlvbl9taXNzaW5nOiB0cnVlIikKfQoKYWxsb3dfY29udGFpbmVyX2Fubm90YXRpb24ocF9vY2ksIGlfb2NpLCBrZXkpIHsKICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjoga2V5ID0iLCBrZXkpCgogICAgcF92YWx1ZSA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBpX3ZhbHVlIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19jb250YWluZXJfYW5ub3RhdGlvbjogcF92YWx1ZSA9IiwgcF92YWx1ZSwgImlfdmFsdWUgPSIsIGlfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlCgogICAgcHJpbnQoImFsbG93X2NvbnRhaW5lcl9hbm5vdGF0aW9uOiB0cnVlIikKfQoKIyAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9uZXRfbmFtZXNwYWNlOiBzdGFydCIpCgogICAga2V5IDo9ICJuZXJkY3RsL25ldHdvcmstbmFtZXNwYWNlIgoKICAgIHBfbmFtZXNwYWNlIDo9IHBfb2NpLkFubm90YXRpb25zW2tleV0KICAgIGlfbmFtZXNwYWNlIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KICAgIHByaW50KCJhbGxvd19zYW5kYm94X25ldF9uYW1lc3BhY2U6IHBfbmFtZXNwYWNlID0iLCBwX25hbWVzcGFjZSwgImlfbmFtZXNwYWNlID0iLCBpX25hbWVzcGFjZSkKCiAgICByZWdleC5tYXRjaChwX25hbWVzcGFjZSwgaV9uYW1lc3BhY2UpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbmV0X25hbWVzcGFjZTogdHJ1ZSIpCn0KCmFsbG93X25ldF9uYW1lc3BhY2UocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbmV0X25hbWVzcGFjZTogc3RhcnQiKQoKICAgIGtleSA6PSAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSIKCiAgICBub3QgcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgbm90IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiYWxsb3dfbmV0X25hbWVzcGFjZTogdHJ1ZSIpCn0KCiMgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbG9nLWRpcmVjdG9yeSIgYW5ub3RhdGlvbgphbGxvd19zYW5kYm94X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpLCBzX25hbWUsIHNfbmFtZXNwYWNlKSB7CiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9sb2dfZGlyZWN0b3J5OiBzdGFydCIpCgogICAga2V5IDo9ICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiCgogICAgcF9kaXIgOj0gcF9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcmVnZXgxIDo9IHJlcGxhY2UocF9kaXIsICIkKHNhbmRib3gtbmFtZSkiLCBzX25hbWUpCiAgICByZWdleDIgOj0gcmVwbGFjZShyZWdleDEsICIkKHNhbmRib3gtbmFtZXNwYWNlKSIsIHNfbmFtZXNwYWNlKQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogcmVnZXgyID0iLCByZWdleDIpCgogICAgaV9kaXIgOj0gaV9vY2kuQW5ub3RhdGlvbnNba2V5XQogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogaV9kaXIgPSIsIGlfZGlyKQoKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4MiwgaV9kaXIpCgogICAgcHJpbnQoImFsbG93X3NhbmRib3hfbG9nX2RpcmVjdG9yeTogdHJ1ZSIpCn0KCmFsbG93X2xvZ19kaXJlY3RvcnkocF9vY2ksIGlfb2NpKSB7CiAgICBwcmludCgiYWxsb3dfbG9nX2RpcmVjdG9yeTogc3RhcnQiKQoKICAgIGtleSA6PSAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1sb2ctZGlyZWN0b3J5IgoKICAgIG5vdCBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBub3QgaV9vY2kuQW5ub3RhdGlvbnNba2V5XQoKICAgIHByaW50KCJhbGxvd19sb2dfZGlyZWN0b3J5OiB0cnVlIikKfQoKYWxsb3dfbGludXgocF9vY2ksIGlfb2NpKSB7CiAgICBwX25hbWVzcGFjZXMgOj0gcF9vY2kuTGludXguTmFtZXNwYWNlcwogICAgcHJpbnQoImFsbG93X2xpbnV4OiBwIG5hbWVzcGFjZXMgPSIsIHBfbmFtZXNwYWNlcykKCiAgICBpX25hbWVzcGFjZXMgOj0gaV9vY2kuTGludXguTmFtZXNwYWNlcwogICAgcHJpbnQoImFsbG93X2xpbnV4OiBpIG5hbWVzcGFjZXMgPSIsIGlfbmFtZXNwYWNlcykKCiAgICBwX25hbWVzcGFjZXMgPT0gaV9uYW1lc3BhY2VzCgogICAgYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkKICAgIGFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkKCiAgICBwcmludCgiYWxsb3dfbGludXg6IHRydWUiKQp9CgphbGxvd19tYXNrZWRfcGF0aHMocF9vY2ksIGlfb2NpKSB7CiAgICBwX3BhdGhzIDo9IHBfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDE6IHBfcGF0aHMgPSIsIHBfcGF0aHMpCgogICAgaV9wYXRocyA6PSBpX29jaS5MaW51eC5NYXNrZWRQYXRocwogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAxOiBpX3BhdGhzID0iLCBpX3BhdGhzKQoKICAgIGFsbG93X21hc2tlZF9wYXRoc19hcnJheShwX3BhdGhzLCBpX3BhdGhzKQoKICAgIHByaW50KCJhbGxvd19tYXNrZWRfcGF0aHMgMTogdHJ1ZSIpCn0KYWxsb3dfbWFza2VkX3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRocyAyOiBzdGFydCIpCgogICAgbm90IHBfb2NpLkxpbnV4Lk1hc2tlZFBhdGhzCiAgICBub3QgaV9vY2kuTGludXguTWFza2VkUGF0aHMKCiAgICBwcmludCgiYWxsb3dfbWFza2VkX3BhdGhzIDI6IHRydWUiKQp9CgojIEFsbCB0aGUgcG9saWN5IG1hc2tlZCBwYXRocyBtdXN0IGJlIG1hc2tlZCBpbiB0aGUgaW5wdXQgZGF0YSB0b28uCiMgSW5wdXQgaXMgYWxsb3dlZCB0byBoYXZlIG1vcmUgbWFza2VkIHBhdGhzIHRoYW4gdGhlIHBvbGljeS4KYWxsb3dfbWFza2VkX3BhdGhzX2FycmF5KHBfYXJyYXksIGlfYXJyYXkpIHsKICAgIGV2ZXJ5IHBfZWxlbSBpbiBwX2FycmF5IHsKICAgICAgICBhbGxvd19tYXNrZWRfcGF0aChwX2VsZW0sIGlfYXJyYXkpCiAgICB9Cn0KCmFsbG93X21hc2tlZF9wYXRoKHBfZWxlbSwgaV9hcnJheSkgewogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfZWxlbSBpbiBpX2FycmF5CiAgICBwX2VsZW0gPT0gaV9lbGVtCgogICAgcHJpbnQoImFsbG93X21hc2tlZF9wYXRoOiB0cnVlIikKfQoKYWxsb3dfcmVhZG9ubHlfcGF0aHMocF9vY2ksIGlfb2NpKSB7CiAgICBwX3BhdGhzIDo9IHBfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRocyAxOiBwX3BhdGhzID0iLCBwX3BhdGhzKQoKICAgIGlfcGF0aHMgOj0gaV9vY2kuTGludXguUmVhZG9ubHlQYXRocwogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IGlfcGF0aHMgPSIsIGlfcGF0aHMpCgogICAgYWxsb3dfcmVhZG9ubHlfcGF0aHNfYXJyYXkocF9wYXRocywgaV9wYXRocywgaV9vY2kuTGludXguTWFza2VkUGF0aHMpCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDE6IHRydWUiKQp9CmFsbG93X3JlYWRvbmx5X3BhdGhzKHBfb2NpLCBpX29jaSkgewogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGhzIDI6IHN0YXJ0IikKCiAgICBub3QgcF9vY2kuTGludXguUmVhZG9ubHlQYXRocwogICAgbm90IGlfb2NpLkxpbnV4LlJlYWRvbmx5UGF0aHMKCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aHMgMjogdHJ1ZSIpCn0KCiMgQWxsIHRoZSBwb2xpY3kgcmVhZG9ubHkgcGF0aHMgbXVzdCBiZSBlaXRoZXI6CiMgLSBQcmVzZW50IGluIHRoZSBpbnB1dCByZWFkb25seSBwYXRocywgb3IKIyAtIFByZXNlbnQgaW4gdGhlIGlucHV0IG1hc2tlZCBwYXRocy4KIyBJbnB1dCBpcyBhbGxvd2VkIHRvIGhhdmUgbW9yZSByZWFkb25seSBwYXRocyB0aGFuIHRoZSBwb2xpY3kuCmFsbG93X3JlYWRvbmx5X3BhdGhzX2FycmF5KHBfYXJyYXksIGlfYXJyYXksIG1hc2tlZF9wYXRocykgewogICAgZXZlcnkgcF9lbGVtIGluIHBfYXJyYXkgewogICAgICAgIGFsbG93X3JlYWRvbmx5X3BhdGgocF9lbGVtLCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpCiAgICB9Cn0KCmFsbG93X3JlYWRvbmx5X3BhdGgocF9lbGVtLCBpX2FycmF5LCBtYXNrZWRfcGF0aHMpIHsKICAgIHByaW50KCJhbGxvd19yZWFkb25seV9wYXRoIDE6IHBfZWxlbSA9IiwgcF9lbGVtKQoKICAgIHNvbWUgaV9lbGVtIGluIGlfYXJyYXkKICAgIHBfZWxlbSA9PSBpX2VsZW0KCiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAxOiB0cnVlIikKfQphbGxvd19yZWFkb25seV9wYXRoKHBfZWxlbSwgaV9hcnJheSwgbWFza2VkX3BhdGhzKSB7CiAgICBwcmludCgiYWxsb3dfcmVhZG9ubHlfcGF0aCAyOiBwX2VsZW0gPSIsIHBfZWxlbSkKCiAgICBzb21lIGlfbWFza2VkIGluIG1hc2tlZF9wYXRocwogICAgcF9lbGVtID09IGlfbWFza2VkCgogICAgcHJpbnQoImFsbG93X3JlYWRvbmx5X3BhdGggMjogdHJ1ZSIpCn0KCiMgQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBpbnB1dCAiaW8ua2F0YWNvbnRhaW5lcnMucGtnLm9jaS5idW5kbGVfcGF0aCIKIyBhbmQgaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCIgdmFsdWVzIHdpdGggb3RoZXIgZmllbGRzLgphbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZChwX29jaSwgaV9vY2ksIHBfc3RvcmFnZXMsIGlfc3RvcmFnZXMpIHsKICAgIHByaW50KCJhbGxvd19ieV9idW5kbGVfb3Jfc2FuZGJveF9pZDogc3RhcnQiKQoKICAgIGJ1bmRsZV9wYXRoIDo9IGlfb2NpLkFubm90YXRpb25zWyJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIl0KICAgIGJ1bmRsZV9pZCA6PSByZXBsYWNlKGJ1bmRsZV9wYXRoLCAiL3J1bi9jb250YWluZXJkL2lvLmNvbnRhaW5lcmQucnVudGltZS52Mi50YXNrL2s4cy5pby8iLCAiIikKCiAgICBrZXkgOj0gImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtaWQiCgogICAgcF9yZWdleCA6PSBwX29jaS5Bbm5vdGF0aW9uc1trZXldCiAgICBzYW5kYm94X2lkIDo9IGlfb2NpLkFubm90YXRpb25zW2tleV0KCiAgICBwcmludCgiYWxsb3dfYnlfYnVuZGxlX29yX3NhbmRib3hfaWQ6IHNhbmRib3hfaWQgPSIsIHNhbmRib3hfaWQsICJyZWdleCA9IiwgcF9yZWdleCkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXgsIHNhbmRib3hfaWQpCgogICAgYWxsb3dfcm9vdF9wYXRoKHBfb2NpLCBpX29jaSwgYnVuZGxlX2lkKQoKICAgIGV2ZXJ5IGlfbW91bnQgaW4gaW5wdXQuT0NJLk1vdW50cyB7CiAgICAgICAgYWxsb3dfbW91bnQocF9vY2ksIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKICAgIH0KCiAgICBhbGxvd19zdG9yYWdlcyhwX3N0b3JhZ2VzLCBpX3N0b3JhZ2VzLCBidW5kbGVfaWQsIHNhbmRib3hfaWQpCgogICAgcHJpbnQoImFsbG93X2J5X2J1bmRsZV9vcl9zYW5kYm94X2lkOiB0cnVlIikKfQoKYWxsb3dfcHJvY2VzcyhwX29jaSwgaV9vY2ksIHNfbmFtZSkgewogICAgcF9wcm9jZXNzIDo9IHBfb2NpLlByb2Nlc3MKICAgIGlfcHJvY2VzcyA6PSBpX29jaS5Qcm9jZXNzCgogICAgcHJpbnQoImFsbG93X3Byb2Nlc3M6IGkgdGVybWluYWwgPSIsIGlfcHJvY2Vzcy5UZXJtaW5hbCwgInAgdGVybWluYWwgPSIsIHBfcHJvY2Vzcy5UZXJtaW5hbCkKICAgIHBfcHJvY2Vzcy5UZXJtaW5hbCA9PSBpX3Byb2Nlc3MuVGVybWluYWwKCiAgICBwcmludCgiYWxsb3dfcHJvY2VzczogaSBjd2QgPSIsIGlfcHJvY2Vzcy5Dd2QsICJpIGN3ZCA9IiwgcF9wcm9jZXNzLkN3ZCkKICAgIHBfcHJvY2Vzcy5Dd2QgPT0gaV9wcm9jZXNzLkN3ZAoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiBpIG5vTmV3UHJpdmlsZWdlcyA9IiwgaV9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcywgInAgbm9OZXdQcml2aWxlZ2VzID0iLCBwX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzKQogICAgcF9wcm9jZXNzLk5vTmV3UHJpdmlsZWdlcyA9PSBpX3Byb2Nlc3MuTm9OZXdQcml2aWxlZ2VzCgogICAgYWxsb3dfY2FwcyhwX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzLCBpX3Byb2Nlc3MuQ2FwYWJpbGl0aWVzKQogICAgYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykKICAgIGFsbG93X2FyZ3MocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkKICAgIGFsbG93X2VudihwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKQoKICAgIHByaW50KCJhbGxvd19wcm9jZXNzOiB0cnVlIikKfQoKYWxsb3dfdXNlcihwX3Byb2Nlc3MsIGlfcHJvY2VzcykgewogICAgcF91c2VyIDo9IHBfcHJvY2Vzcy5Vc2VyCiAgICBpX3VzZXIgOj0gaV9wcm9jZXNzLlVzZXIKCiAgICBwcmludCgiYWxsb3dfdXNlcjogaW5wdXQgdWlkID0iLCBpX3VzZXIuVUlELCAicG9saWN5IHVpZCA9IiwgcF91c2VyLlVJRCkKICAgIHBfdXNlci5VSUQgPT0gaV91c2VyLlVJRAoKICAgICMgVE9ETzogdHJhY2sgZG93biB0aGUgcmVhc29uIGZvciByZWdpc3RyeS5rOHMuaW8vcGF1c2U6My45IGJlaW5nCiAgICAjICAgICAgIGV4ZWN1dGVkIHdpdGggZ2lkID0gMCBkZXNwaXRlIGhhdmluZyAiNjU1MzU6NjU1MzUiIGluIGl0cyBjb250YWluZXIgaW1hZ2UKICAgICMgICAgICAgY29uZmlnLgogICAgI3ByaW50KCJhbGxvd191c2VyOiBpbnB1dCBnaWQgPSIsIGlfdXNlci5HSUQsICJwb2xpY3kgZ2lkID0iLCBwX3VzZXIuR0lEKQogICAgI3BfdXNlci5HSUQgPT0gaV91c2VyLkdJRAoKICAgICMgVE9ETzogY29tcGFyZSB0aGUgYWRkaXRpb25hbEdpZHMgZmllbGQgdG9vIGFmdGVyIGNvbXB1dGluZyBpdHMgdmFsdWUKICAgICMgYmFzZWQgb24gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvZ3JvdXAgZnJvbSB0aGUgY29udGFpbmVyIGltYWdlLgp9CgphbGxvd19hcmdzKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHByaW50KCJhbGxvd19hcmdzIDE6IG5vIGFyZ3MiKQoKICAgIG5vdCBwX3Byb2Nlc3MuQXJncwogICAgbm90IGlfcHJvY2Vzcy5BcmdzCgogICAgcHJpbnQoImFsbG93X2FyZ3MgMTogdHJ1ZSIpCn0KYWxsb3dfYXJncyhwX3Byb2Nlc3MsIGlfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwcmludCgiYWxsb3dfYXJncyAyOiBwb2xpY3kgYXJncyA9IiwgcF9wcm9jZXNzLkFyZ3MpCiAgICBwcmludCgiYWxsb3dfYXJncyAyOiBpbnB1dCBhcmdzID0iLCBpX3Byb2Nlc3MuQXJncykKCiAgICBjb3VudChwX3Byb2Nlc3MuQXJncykgPT0gY291bnQoaV9wcm9jZXNzLkFyZ3MpCgogICAgZXZlcnkgaSwgaV9hcmcgaW4gaV9wcm9jZXNzLkFyZ3MgewogICAgICAgIGFsbG93X2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpCiAgICB9CgogICAgcHJpbnQoImFsbG93X2FyZ3MgMjogdHJ1ZSIpCn0KYWxsb3dfYXJnKGksIGlfYXJnLCBwX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcF9hcmcgOj0gcF9wcm9jZXNzLkFyZ3NbaV0KICAgIHByaW50KCJhbGxvd19hcmcgMTogaSA9IiwgaSwgImlfYXJnID0iLCBpX2FyZywgInBfYXJnID0iLCBwX2FyZykKCiAgICBwX2FyZzIgOj0gcmVwbGFjZShwX2FyZywgIiQkIiwgIiQiKQogICAgcF9hcmcyID09IGlfYXJnCgogICAgcHJpbnQoImFsbG93X2FyZyAxOiB0cnVlIikKfQphbGxvd19hcmcoaSwgaV9hcmcsIHBfcHJvY2Vzcywgc19uYW1lKSB7CiAgICBwX2FyZyA6PSBwX3Byb2Nlc3MuQXJnc1tpXQogICAgcHJpbnQoImFsbG93X2FyZyAyOiBpID0iLCBpLCAiaV9hcmcgPSIsIGlfYXJnLCAicF9hcmcgPSIsIHBfYXJnKQoKICAgICMgVE9ETzogY2FuICQobm9kZS1uYW1lKSBiZSBoYW5kbGVkIGJldHRlcj8KICAgIGNvbnRhaW5zKHBfYXJnLCAiJChub2RlLW5hbWUpIikKCiAgICBwcmludCgiYWxsb3dfYXJnIDI6IHRydWUiKQp9CmFsbG93X2FyZyhpLCBpX2FyZywgcF9wcm9jZXNzLCBzX25hbWUpIHsKICAgIHBfYXJnIDo9IHBfcHJvY2Vzcy5BcmdzW2ldCiAgICBwcmludCgiYWxsb3dfYXJnIDM6IGkgPSIsIGksICJpX2FyZyA9IiwgaV9hcmcsICJwX2FyZyA9IiwgcF9hcmcpCgogICAgcF9hcmcyIDo9IHJlcGxhY2UocF9hcmcsICIkJCIsICIkIikKICAgIHBfYXJnMyA6PSByZXBsYWNlKHBfYXJnMiwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKICAgIHByaW50KCJhbGxvd19hcmcgMzogcF9hcmczID0iLCBwX2FyZzMpCiAgICBwX2FyZzMgPT0gaV9hcmcKCiAgICBwcmludCgiYWxsb3dfYXJnIDM6IHRydWUiKQp9CgojIE9DSSBwcm9jZXNzLkVudiBmaWVsZAphbGxvd19lbnYocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIHNfbmFtZSkgewogICAgcHJpbnQoImFsbG93X2VudjogcCBlbnYgPSIsIHBfcHJvY2Vzcy5FbnYpCiAgICBwcmludCgiYWxsb3dfZW52OiBpIGVudiA9IiwgaV9wcm9jZXNzLkVudikKCiAgICBldmVyeSBpX3ZhciBpbiBpX3Byb2Nlc3MuRW52IHsKICAgICAgICBwcmludCgiYWxsb3dfZW52OiBpX3ZhciA9IiwgaV92YXIpCiAgICAgICAgYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKQogICAgfQoKICAgIHByaW50KCJhbGxvd19lbnY6IHRydWUiKQp9CgojIEFsbG93IGlucHV0IGVudiB2YXJpYWJsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcG9saWN5IGRhdGEgdG9vLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgcF92YXIgPT0gaV92YXIKICAgIHByaW50KCJhbGxvd192YXIgMTogdHJ1ZSIpCn0KCiMgTWF0Y2ggaW5wdXQgd2l0aCBvbmUgb2YgdGhlIHBvbGljeSB2YXJpYWJsZXMsIGFmdGVyIHN1YnN0aXR1dGluZyAkKHNhbmRib3gtbmFtZSkuCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSkgewogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX3ZhcjIgOj0gcmVwbGFjZShwX3ZhciwgIiQoc2FuZGJveC1uYW1lKSIsIHNfbmFtZSkKCiAgICBwcmludCgiYWxsb3dfdmFyIDI6IHBfdmFyMiA9IiwgcF92YXIyKQogICAgcF92YXIyID09IGlfdmFyCgogICAgcHJpbnQoImFsbG93X3ZhciAyOiB0cnVlIikKfQoKIyBBbGxvdyBpbnB1dCBlbnYgdmFyaWFibGVzIHRoYXQgbWF0Y2ggd2l0aCBhIHJlcXVlc3RfZGVmYXVsdHMgcmVnZXguCmFsbG93X3ZhcihwX3Byb2Nlc3MsIGlfcHJvY2VzcywgaV92YXIsIHNfbmFtZSkgewogICAgc29tZSBwX3JlZ2V4MSBpbiBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLkNyZWF0ZUNvbnRhaW5lclJlcXVlc3QuYWxsb3dfZW52X3JlZ2V4CiAgICBwX3JlZ2V4MiA6PSByZXBsYWNlKHBfcmVnZXgxLCAiJChpcHY0X2EpIiwgcG9saWN5X2RhdGEuY29tbW9uLmlwdjRfYSkKICAgIHBfcmVnZXgzIDo9IHJlcGxhY2UocF9yZWdleDIsICIkKGlwX3ApIiwgcG9saWN5X2RhdGEuY29tbW9uLmlwX3ApCiAgICBwX3JlZ2V4NCA6PSByZXBsYWNlKHBfcmVnZXgzLCAiJChzdmNfbmFtZSkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3ZjX25hbWUpCiAgICBwX3JlZ2V4NSA6PSByZXBsYWNlKHBfcmVnZXg0LCAiJChkbnNfbGFiZWwpIiwgcG9saWN5X2RhdGEuY29tbW9uLmRuc19sYWJlbCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IHBfcmVnZXg1ID0iLCBwX3JlZ2V4NSkKICAgIHJlZ2V4Lm1hdGNoKHBfcmVnZXg1LCBpX3ZhcikKCiAgICBwcmludCgiYWxsb3dfdmFyIDM6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5wb2RJUCIgdmFsdWVzLgphbGxvd192YXIocF9wcm9jZXNzLCBpX3Byb2Nlc3MsIGlfdmFyLCBzX25hbWUpIHsKICAgIG5hbWVfdmFsdWUgOj0gc3BsaXQoaV92YXIsICI9IikKICAgIGNvdW50KG5hbWVfdmFsdWUpID09IDIKICAgIGlzX2lwKG5hbWVfdmFsdWVbMV0pCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBhbGxvd19wb2RfaXBfdmFyKG5hbWVfdmFsdWVbMF0sIHBfdmFyKQoKICAgIHByaW50KCJhbGxvd192YXIgNDogdHJ1ZSIpCn0KCiMgQWxsb3cgY29tbW9uIGZpZWxkUmVmIHZhcmlhYmxlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA6PSBbIiQoaG9zdC1uYW1lKSIsICIkKG5vZGUtbmFtZSkiLCAiJChwb2QtdWlkKSJdCiAgICBzb21lIGFsbG93ZWQgaW4gYWx3YXlzX2FsbG93ZWQKICAgIGNvbnRhaW5zKHBfbmFtZV92YWx1ZVsxXSwgYWxsb3dlZCkKCiAgICBwcmludCgiYWxsb3dfdmFyIDU6IHRydWUiKQp9CgojIEFsbG93IGZpZWxkUmVmICJmaWVsZFBhdGg6IHN0YXR1cy5ob3N0SVAiIHZhbHVlcy4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCiAgICBpc19pcChuYW1lX3ZhbHVlWzFdKQoKICAgIHNvbWUgcF92YXIgaW4gcF9wcm9jZXNzLkVudgogICAgYWxsb3dfaG9zdF9pcF92YXIobmFtZV92YWx1ZVswXSwgcF92YXIpCgogICAgcHJpbnQoImFsbG93X3ZhciA2OiB0cnVlIikKfQoKIyBBbGxvdyByZXNvdXJjZUZpZWxkUmVmIHZhbHVlcyAoZS5nLiwgImxpbWl0cy5jcHUiKS4KYWxsb3dfdmFyKHBfcHJvY2VzcywgaV9wcm9jZXNzLCBpX3Zhciwgc19uYW1lKSB7CiAgICBuYW1lX3ZhbHVlIDo9IHNwbGl0KGlfdmFyLCAiPSIpCiAgICBjb3VudChuYW1lX3ZhbHVlKSA9PSAyCgogICAgc29tZSBwX3ZhciBpbiBwX3Byb2Nlc3MuRW52CiAgICBwX25hbWVfdmFsdWUgOj0gc3BsaXQocF92YXIsICI9IikKICAgIGNvdW50KHBfbmFtZV92YWx1ZSkgPT0gMgoKICAgIHBfbmFtZV92YWx1ZVswXSA9PSBuYW1lX3ZhbHVlWzBdCgogICAgIyBUT0RPOiBzaG91bGQgdGhlc2UgYmUgaGFuZGxlZCBpbiBhIGRpZmZlcmVudCB3YXk/CiAgICBhbHdheXNfYWxsb3dlZCA9IFsiJChyZXNvdXJjZS1maWVsZCkiLCAiJCh0b2RvLWFubm90YXRpb24pIl0KICAgIHNvbWUgYWxsb3dlZCBpbiBhbHdheXNfYWxsb3dlZAogICAgY29udGFpbnMocF9uYW1lX3ZhbHVlWzFdLCBhbGxvd2VkKQoKICAgIHByaW50KCJhbGxvd192YXIgNzogdHJ1ZSIpCn0KCmFsbG93X3BvZF9pcF92YXIodmFyX25hbWUsIHBfdmFyKSB7CiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdmFyX25hbWUgPSIsIHZhcl9uYW1lLCAicF92YXIgPSIsIHBfdmFyKQoKICAgIHBfbmFtZV92YWx1ZSA6PSBzcGxpdChwX3ZhciwgIj0iKQogICAgY291bnQocF9uYW1lX3ZhbHVlKSA9PSAyCgogICAgcF9uYW1lX3ZhbHVlWzBdID09IHZhcl9uYW1lCiAgICBwX25hbWVfdmFsdWVbMV0gPT0gIiQocG9kLWlwKSIKCiAgICBwcmludCgiYWxsb3dfcG9kX2lwX3ZhcjogdHJ1ZSIpCn0KCmFsbG93X2hvc3RfaXBfdmFyKHZhcl9uYW1lLCBwX3ZhcikgewogICAgcHJpbnQoImFsbG93X2hvc3RfaXBfdmFyOiB2YXJfbmFtZSA9IiwgdmFyX25hbWUsICJwX3ZhciA9IiwgcF92YXIpCgogICAgcF9uYW1lX3ZhbHVlIDo9IHNwbGl0KHBfdmFyLCAiPSIpCiAgICBjb3VudChwX25hbWVfdmFsdWUpID09IDIKCiAgICBwX25hbWVfdmFsdWVbMF0gPT0gdmFyX25hbWUKICAgIHBfbmFtZV92YWx1ZVsxXSA9PSAiJChob3N0LWlwKSIKCiAgICBwcmludCgiYWxsb3dfaG9zdF9pcF92YXI6IHRydWUiKQp9Cgppc19pcCh2YWx1ZSkgewogICAgYnl0ZXMgPSBzcGxpdCh2YWx1ZSwgIi4iKQogICAgY291bnQoYnl0ZXMpID09IDQKCiAgICBpc19pcF9maXJzdF9ieXRlKGJ5dGVzWzBdKQogICAgaXNfaXBfb3RoZXJfYnl0ZShieXRlc1sxXSkKICAgIGlzX2lwX290aGVyX2J5dGUoYnl0ZXNbMl0pCiAgICBpc19pcF9vdGhlcl9ieXRlKGJ5dGVzWzNdKQp9CmlzX2lwX2ZpcnN0X2J5dGUoY29tcG9uZW50KSB7CiAgICBudW1iZXIgPSB0b19udW1iZXIoY29tcG9uZW50KQogICAgbnVtYmVyID49IDEKICAgIG51bWJlciA8PSAyNTUKfQppc19pcF9vdGhlcl9ieXRlKGNvbXBvbmVudCkgewogICAgbnVtYmVyID0gdG9fbnVtYmVyKGNvbXBvbmVudCkKICAgIG51bWJlciA+PSAwCiAgICBudW1iZXIgPD0gMjU1Cn0KCiMgT0NJIHJvb3QuUGF0aAphbGxvd19yb290X3BhdGgocF9vY2ksIGlfb2NpLCBidW5kbGVfaWQpIHsKICAgIGlfcGF0aCA6PSBpX29jaS5Sb290LlBhdGgKICAgIHBfcGF0aDEgOj0gcF9vY2kuUm9vdC5QYXRoCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBpX3BhdGggPSIsIGlfcGF0aCwgInBfcGF0aDEgPSIsIHBfcGF0aDEpCgogICAgcF9wYXRoMiA6PSByZXBsYWNlKHBfcGF0aDEsICIkKGNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5jcGF0aCkKICAgIHByaW50KCJhbGxvd19yb290X3BhdGg6IHBfcGF0aDIgPSIsIHBfcGF0aDIpCgogICAgcF9wYXRoMyA6PSByZXBsYWNlKHBfcGF0aDIsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCiAgICBwcmludCgiYWxsb3dfcm9vdF9wYXRoOiBwX3BhdGgzID0iLCBwX3BhdGgzKQoKICAgIHBfcGF0aDMgPT0gaV9wYXRoCgogICAgcHJpbnQoImFsbG93X3Jvb3RfcGF0aDogdHJ1ZSIpCn0KCiMgZGV2aWNlIG1vdW50cwphbGxvd19tb3VudChwX29jaSwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnQ6IGlfbW91bnQgPSIsIGlfbW91bnQpCgogICAgc29tZSBwX21vdW50IGluIHBfb2NpLk1vdW50cwogICAgcHJpbnQoImFsbG93X21vdW50OiBwX21vdW50ID0iLCBwX21vdW50KQogICAgY2hlY2tfbW91bnQocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKQoKICAgICMgVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBwb2xpY3kgY2hlY2tzIGZvciBtb3VudHMgLSBlLmcuLAogICAgIyAgICAgICBtdWx0aXBsZSBtb3VudHMgd2l0aCBzYW1lIHNvdXJjZSBvciBkZXN0aW5hdGlvbj8KCiAgICBwcmludCgiYWxsb3dfbW91bnQ6IHRydWUiKQp9CgpjaGVja19tb3VudChwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHBfbW91bnQgPT0gaV9tb3VudAogICAgcHJpbnQoImNoZWNrX21vdW50IDE6IHRydWUiKQp9CmNoZWNrX21vdW50KHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkgewogICAgcF9tb3VudC5kZXN0aW5hdGlvbiA9PSBpX21vdW50LmRlc3RpbmF0aW9uCiAgICBwX21vdW50LnR5cGVfID09IGlfbW91bnQudHlwZV8KICAgIHBfbW91bnQub3B0aW9ucyA9PSBpX21vdW50Lm9wdGlvbnMKCiAgICBtb3VudF9zb3VyY2VfYWxsb3dzKHBfbW91bnQsIGlfbW91bnQsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCkKCiAgICBwcmludCgiY2hlY2tfbW91bnQgMjogdHJ1ZSIpCn0KCm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICByZWdleDEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKGJ1bmRsZS1pZCkiLCBidW5kbGVfaWQpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMTogcmVnZXg0ID0iLCByZWdleDQpCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlfbW91bnQuc291cmNlKQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDE6IHRydWUiKQp9Cm1vdW50X3NvdXJjZV9hbGxvd3MocF9tb3VudCwgaV9tb3VudCwgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICByZWdleDEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHJlZ2V4MiA6PSByZXBsYWNlKHJlZ2V4MSwgIiQoc2ZwcmVmaXgpIiwgcG9saWN5X2RhdGEuY29tbW9uLnNmcHJlZml4KQogICAgcmVnZXgzIDo9IHJlcGxhY2UocmVnZXgyLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICByZWdleDQgOj0gcmVwbGFjZShyZWdleDMsICIkKHNhbmRib3gtaWQpIiwgc2FuZGJveF9pZCkKCiAgICBwcmludCgibW91bnRfc291cmNlX2FsbG93cyAyOiByZWdleDQgPSIsIHJlZ2V4NCkKICAgIHJlZ2V4Lm1hdGNoKHJlZ2V4NCwgaV9tb3VudC5zb3VyY2UpCgogICAgcHJpbnQoIm1vdW50X3NvdXJjZV9hbGxvd3MgMjogdHJ1ZSIpCn0KbW91bnRfc291cmNlX2FsbG93cyhwX21vdW50LCBpX21vdW50LCBidW5kbGVfaWQsIHNhbmRib3hfaWQpIHsKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IGlfbW91bnQuc291cmNlPSIsIGlfbW91bnQuc291cmNlKQoKICAgIGlfc291cmNlX3BhcnRzID0gc3BsaXQoaV9tb3VudC5zb3VyY2UsICIvIikKICAgIGI2NF9kaXJlY3Rfdm9sX3BhdGggPSBpX3NvdXJjZV9wYXJ0c1tjb3VudChpX3NvdXJjZV9wYXJ0cykgLSAxXQoKICAgIGJhc2U2NC5pc192YWxpZChiNjRfZGlyZWN0X3ZvbF9wYXRoKQoKICAgIHNvdXJjZTEgOj0gcF9tb3VudC5zb3VyY2UKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHNvdXJjZTEgPSIsIHNvdXJjZTEpCgogICAgc291cmNlMiA6PSByZXBsYWNlKHNvdXJjZTEsICIkKHNwYXRoKSIsIHBvbGljeV9kYXRhLmNvbW1vbi5zcGF0aCkKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHNvdXJjZTIgPSIsIHNvdXJjZTIpCgogICAgc291cmNlMyA6PSByZXBsYWNlKHNvdXJjZTIsICIkKGI2NC1kaXJlY3Qtdm9sLXBhdGgpIiwgYjY0X2RpcmVjdF92b2xfcGF0aCkKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHNvdXJjZTMgPSIsIHNvdXJjZTMpCgogICAgc291cmNlMyA9PSBpX21vdW50LnNvdXJjZQoKICAgIHByaW50KCJtb3VudF9zb3VyY2VfYWxsb3dzIDM6IHRydWUiKQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ3JlYXRlIGNvbnRhaW5lciBTdG9yYWdlcwoKYWxsb3dfc3RvcmFnZXMocF9zdG9yYWdlcywgaV9zdG9yYWdlcywgYnVuZGxlX2lkLCBzYW5kYm94X2lkKSB7CiAgICBwX2NvdW50IDo9IGNvdW50KHBfc3RvcmFnZXMpCiAgICBpX2NvdW50IDo9IGNvdW50KGlfc3RvcmFnZXMpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IHBfY291bnQgPSIsIHBfY291bnQsICJpX2NvdW50ID0iLCBpX2NvdW50KQoKICAgIHBfY291bnQgPT0gaV9jb3VudAoKICAgICMgR2V0IHRoZSBjb250YWluZXIgaW1hZ2UgbGF5ZXIgSURzIGFuZCB2ZXJpdHkgcm9vdCBoYXNoZXMsIGZyb20gdGhlICJvdmVybGF5ZnMiIHN0b3JhZ2UuCiAgICBzb21lIG92ZXJsYXlfc3RvcmFnZSBpbiBwX3N0b3JhZ2VzCiAgICBvdmVybGF5X3N0b3JhZ2UuZHJpdmVyID09ICJvdmVybGF5ZnMiCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZXM6IG92ZXJsYXlfc3RvcmFnZSA9Iiwgb3ZlcmxheV9zdG9yYWdlKQogICAgY291bnQob3ZlcmxheV9zdG9yYWdlLm9wdGlvbnMpID09IDIKCiAgICBsYXllcl9pZHMgOj0gc3BsaXQob3ZlcmxheV9zdG9yYWdlLm9wdGlvbnNbMF0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogbGF5ZXJfaWRzID0iLCBsYXllcl9pZHMpCgogICAgcm9vdF9oYXNoZXMgOj0gc3BsaXQob3ZlcmxheV9zdG9yYWdlLm9wdGlvbnNbMV0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogcm9vdF9oYXNoZXMgPSIsIHJvb3RfaGFzaGVzKQoKICAgIGV2ZXJ5IGlfc3RvcmFnZSBpbiBpX3N0b3JhZ2VzIHsKICAgICAgICBhbGxvd19zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMsIHJvb3RfaGFzaGVzKQogICAgfQoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2UocF9zdG9yYWdlcywgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZTogcF9zdG9yYWdlID0iLCBwX3N0b3JhZ2UpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZTogaV9zdG9yYWdlID0iLCBpX3N0b3JhZ2UpCgogICAgcF9zdG9yYWdlLmRyaXZlciAgICAgICAgICAgPT0gaV9zdG9yYWdlLmRyaXZlcgogICAgcF9zdG9yYWdlLmRyaXZlcl9vcHRpb25zICAgPT0gaV9zdG9yYWdlLmRyaXZlcl9vcHRpb25zCiAgICBwX3N0b3JhZ2UuZnNfZ3JvdXAgICAgICAgICA9PSBpX3N0b3JhZ2UuZnNfZ3JvdXAKCiAgICBhbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpCiAgICBhbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpCgogICAgIyBUT0RPOiB2YWxpZGF0ZSB0aGUgc291cmNlIGZpZWxkIHRvby4KCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZTogdHJ1ZSIpCn0KCmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAxOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciAhPSAib3ZlcmxheWZzIgogICAgcF9zdG9yYWdlLm9wdGlvbnMgPT0gaV9zdG9yYWdlLm9wdGlvbnMKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDE6IHRydWUiKQp9CmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAib3ZlcmxheWZzIgogICAgY291bnQocF9zdG9yYWdlLm9wdGlvbnMpID09IDIKCiAgICBwb2xpY3lfaWRzIDo9IHNwbGl0KHBfc3RvcmFnZS5vcHRpb25zWzBdLCAiOiIpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBvbGljeV9pZHMgPSIsIHBvbGljeV9pZHMpCiAgICBwb2xpY3lfaWRzID09IGxheWVyX2lkcwoKICAgIHBvbGljeV9oYXNoZXMgOj0gc3BsaXQocF9zdG9yYWdlLm9wdGlvbnNbMV0sICI6IikKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogcG9saWN5X2hhc2hlcyA9IiwgcG9saWN5X2hhc2hlcykKCiAgICBwX2NvdW50IDo9IGNvdW50KHBvbGljeV9pZHMpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IHBfY291bnQgPSIsIHBfY291bnQpCiAgICBwX2NvdW50ID49IDEKICAgIHBfY291bnQgPT0gY291bnQocG9saWN5X2hhc2hlcykKCiAgICBpX2NvdW50IDo9IGNvdW50KGlfc3RvcmFnZS5vcHRpb25zKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiBpX2NvdW50ID0iLCBpX2NvdW50KQogICAgaV9jb3VudCA9PSBwX2NvdW50ICsgMwoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9zdG9yYWdlLm9wdGlvbnNbMF0gPSIsIGlfc3RvcmFnZS5vcHRpb25zWzBdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbMF0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllci1zcmMtcHJlZml4PS92YXIvbGliL2NvbnRhaW5lcmQvaW8uY29udGFpbmVyZC5zbmFwc2hvdHRlci52MS50YXJkZXYvbGF5ZXJzIgoKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMjogaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDJdID0iLCBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMl0pCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1tpX2NvdW50IC0gMl0gPT0gImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5vdmVybGF5LXJ3IgoKICAgIGxvd2VyZGlyIDo9IGNvbmNhdCgiPSIsIFsibG93ZXJkaXIiLCBwX3N0b3JhZ2Uub3B0aW9uc1swXV0pCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGxvd2VyZGlyID0iLCBsb3dlcmRpcikKCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDI6IGlfc3RvcmFnZS5vcHRpb25zW2lfY291bnQgLSAxXSA9IiwgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdKQogICAgaV9zdG9yYWdlLm9wdGlvbnNbaV9jb3VudCAtIDFdID09IGxvd2VyZGlyCgogICAgZXZlcnkgaSwgcG9saWN5X2lkIGluIHBvbGljeV9pZHMgewogICAgICAgIGFsbG93X292ZXJsYXlfbGF5ZXIocG9saWN5X2lkLCBwb2xpY3lfaGFzaGVzW2ldLCBpX3N0b3JhZ2Uub3B0aW9uc1tpICsgMV0pCiAgICB9CgogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAyOiB0cnVlIikKfQphbGxvd19zdG9yYWdlX29wdGlvbnMocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGxheWVyX2lkcywgcm9vdF9oYXNoZXMpIHsKICAgIHByaW50KCJhbGxvd19zdG9yYWdlX29wdGlvbnMgMzogc3RhcnQiKQoKICAgIHBfc3RvcmFnZS5kcml2ZXIgPT0gImJsayIKICAgIGNvdW50KHBfc3RvcmFnZS5vcHRpb25zKSA9PSAxCgogICAgc3RhcnRzd2l0aChwX3N0b3JhZ2Uub3B0aW9uc1swXSwgIiQoaGFzaCIpCiAgICBoYXNoX3N1ZmZpeCA6PSB0cmltX2xlZnQocF9zdG9yYWdlLm9wdGlvbnNbMF0sICIkKGhhc2giKQoKICAgIGVuZHN3aXRoKGhhc2hfc3VmZml4LCAiKSIpCiAgICBoYXNoX2luZGV4IDo9IHRyaW1fcmlnaHQoaGFzaF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGhhc2hfaW5kZXgpCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IGkgPSIsIGkpCgogICAgaGFzaF9vcHRpb24gOj0gY29uY2F0KCI9IiwgWyJpby5rYXRhY29udGFpbmVycy5mcy1vcHQucm9vdC1oYXNoIiwgcm9vdF9oYXNoZXNbaV1dKQogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyAzOiBoYXNoX29wdGlvbiA9IiwgaGFzaF9vcHRpb24pCgogICAgY291bnQoaV9zdG9yYWdlLm9wdGlvbnMpID09IDQKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJybyIKICAgIGlfc3RvcmFnZS5vcHRpb25zWzFdID09ICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUiCiAgICBpX3N0b3JhZ2Uub3B0aW9uc1syXSA9PSAiaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbM10gPT0gaGFzaF9vcHRpb24KCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDM6IHRydWUiKQp9CmFsbG93X3N0b3JhZ2Vfb3B0aW9ucyhwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgbGF5ZXJfaWRzLCByb290X2hhc2hlcykgewogICAgcHJpbnQoImFsbG93X3N0b3JhZ2Vfb3B0aW9ucyA0OiBzdGFydCIpCgogICAgcF9zdG9yYWdlLmRyaXZlciA9PSAic21iIgogICAgY291bnQoaV9zdG9yYWdlLm9wdGlvbnMpID09IDgKICAgIGlfc3RvcmFnZS5vcHRpb25zWzBdID09ICJkaXJfbW9kZT0wNjY2IgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMV0gPT0gImZpbGVfbW9kZT0wNjY2IgogICAgaV9zdG9yYWdlLm9wdGlvbnNbMl0gPT0gIm1mc3ltbGlua3MiICAgIAogICAgaV9zdG9yYWdlLm9wdGlvbnNbM10gPT0gImNhY2hlPXN0cmljdCIgIAogICAgaV9zdG9yYWdlLm9wdGlvbnNbNF0gPT0gIm5vc2hhcmVzb2NrIgogICAgaV9zdG9yYWdlLm9wdGlvbnNbNV0gPT0gImFjdGltZW89MzAiICAgIAogICAgc3RhcnRzd2l0aChpX3N0b3JhZ2Uub3B0aW9uc1s2XSwgImFkZHI9IikKICAgIGNyZWRzID0gc3BsaXQoaV9zdG9yYWdlLm9wdGlvbnNbN10sICIsIikKICAgIGNvdW50KGNyZWRzKSA9PSAyCiAgICBzdGFydHN3aXRoKGNyZWRzWzBdLCAidXNlcm5hbWU9IikKICAgIHN0YXJ0c3dpdGgoY3JlZHNbMV0sICJwYXNzd29yZD0iKQogICAgCiAgICBwcmludCgiYWxsb3dfc3RvcmFnZV9vcHRpb25zIDQ6IHRydWUiKQp9CgphbGxvd19vdmVybGF5X2xheWVyKHBvbGljeV9pZCwgcG9saWN5X2hhc2gsIGlfb3B0aW9uKSB7CiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogcG9saWN5X2lkID0iLCBwb2xpY3lfaWQsICJwb2xpY3lfaGFzaCA9IiwgcG9saWN5X2hhc2gpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV9vcHRpb24gPSIsIGlfb3B0aW9uKQoKICAgIHN0YXJ0c3dpdGgoaV9vcHRpb24sICJpby5rYXRhY29udGFpbmVycy5mcy1vcHQubGF5ZXI9IikKICAgIGlfdmFsdWUgOj0gcmVwbGFjZShpX29wdGlvbiwgImlvLmthdGFjb250YWluZXJzLmZzLW9wdC5sYXllcj0iLCAiIikKICAgIGlfdmFsdWVfZGVjb2RlZCA6PSBiYXNlNjQuZGVjb2RlKGlfdmFsdWUpCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogaV92YWx1ZV9kZWNvZGVkID0iLCBpX3ZhbHVlX2RlY29kZWQpCgogICAgcG9saWN5X3N1ZmZpeCA6PSBjb25jYXQoIj0iLCBbInRhcixybyxpby5rYXRhY29udGFpbmVycy5mcy1vcHQuYmxvY2tfZGV2aWNlPWZpbGUsaW8ua2F0YWNvbnRhaW5lcnMuZnMtb3B0LmlzLWxheWVyLGlvLmthdGFjb250YWluZXJzLmZzLW9wdC5yb290LWhhc2giLCBwb2xpY3lfaGFzaF0pCiAgICBwX3ZhbHVlIDo9IGNvbmNhdCgiLCIsIFtwb2xpY3lfaWQsIHBvbGljeV9zdWZmaXhdKQogICAgcHJpbnQoImFsbG93X292ZXJsYXlfbGF5ZXI6IHBfdmFsdWUgPSIsIHBfdmFsdWUpCgogICAgcF92YWx1ZSA9PSBpX3ZhbHVlX2RlY29kZWQKCiAgICBwcmludCgiYWxsb3dfb3ZlcmxheV9sYXllcjogdHJ1ZSIpCn0KCmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAidGFyIgoKICAgIHN0YXJ0c3dpdGgocF9zdG9yYWdlLm1vdW50X3BvaW50LCAiJChsYXllciIpCiAgICBtb3VudF9zdWZmaXggOj0gdHJpbV9sZWZ0KHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQobGF5ZXIiKQoKICAgIGVuZHN3aXRoKG1vdW50X3N1ZmZpeCwgIikiKQogICAgbGF5ZXJfaW5kZXggOj0gdHJpbV9yaWdodChtb3VudF9zdWZmaXgsICIpIikKICAgIGkgOj0gdG9fbnVtYmVyKGxheWVyX2luZGV4KQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IGkgPSIsIGkpCgogICAgbGF5ZXJfaWQgOj0gbGF5ZXJfaWRzW2ldCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMTogbGF5ZXJfaWQgPSIsIGxheWVyX2lkKQoKICAgIHBfbW91bnQgOj0gY29uY2F0KCIvIiwgWyIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L2xheWVycyIsIGxheWVyX2lkXSkKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCAxOiBwX21vdW50ID0iLCBwX21vdW50KQoKICAgIHBfbW91bnQgPT0gaV9zdG9yYWdlLm1vdW50X3BvaW50CgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDE6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiZnVzZTMua2F0YS1vdmVybGF5IgoKICAgIG1vdW50MSA6PSByZXBsYWNlKHBfc3RvcmFnZS5tb3VudF9wb2ludCwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDI6IG1vdW50MiA9IiwgbW91bnQyKQoKICAgIG1vdW50MiA9PSBpX3N0b3JhZ2UubW91bnRfcG9pbnQKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMjogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwX3N0b3JhZ2UuZnN0eXBlID09ICJsb2NhbCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChzYW5kYm94LWlkKSIsIHNhbmRib3hfaWQpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgMzogbW91bnQzID0iLCBtb3VudDMpCgogICAgcmVnZXgubWF0Y2gobW91bnQzLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCgogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDM6IHRydWUiKQp9CmFsbG93X21vdW50X3BvaW50KHBfc3RvcmFnZSwgaV9zdG9yYWdlLCBidW5kbGVfaWQsIHNhbmRib3hfaWQsIGxheWVyX2lkcykgewogICAgcF9zdG9yYWdlLmZzdHlwZSA9PSAiYmluZCIKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChjcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uY3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNDogbW91bnQyID0iLCBtb3VudDIpCgogICAgbW91bnQzIDo9IHJlcGxhY2UobW91bnQyLCAiJChidW5kbGUtaWQpIiwgYnVuZGxlX2lkKQogICAgcHJpbnQoImFsbG93X21vdW50X3BvaW50IDQ6IG1vdW50MyA9IiwgbW91bnQzKQoKICAgIHJlZ2V4Lm1hdGNoKG1vdW50MywgaV9zdG9yYWdlLm1vdW50X3BvaW50KQoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA0OiB0cnVlIikKfQphbGxvd19tb3VudF9wb2ludChwX3N0b3JhZ2UsIGlfc3RvcmFnZSwgYnVuZGxlX2lkLCBzYW5kYm94X2lkLCBsYXllcl9pZHMpIHsKICAgIHBfc3RvcmFnZS5mc3R5cGUgPT0gInRtcGZzIgoKICAgIG1vdW50MSA6PSBwX3N0b3JhZ2UubW91bnRfcG9pbnQKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA1OiBtb3VudDEgPSIsIG1vdW50MSkKCiAgICByZWdleC5tYXRjaChtb3VudDEsIGlfc3RvcmFnZS5tb3VudF9wb2ludCkKCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNTogdHJ1ZSIpCn0KYWxsb3dfbW91bnRfcG9pbnQocF9zdG9yYWdlLCBpX3N0b3JhZ2UsIGJ1bmRsZV9pZCwgc2FuZGJveF9pZCwgbGF5ZXJfaWRzKSB7CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogaV9zdG9yYWdlLm1vdW50X3BvaW50ID0iLCBpX3N0b3JhZ2UubW91bnRfcG9pbnQpCiAgICBhbGxvd19kaXJlY3Rfdm9sX2RyaXZlcihwX3N0b3JhZ2UsIGlfc3RvcmFnZSkKCiAgICBtb3VudDEgOj0gcF9zdG9yYWdlLm1vdW50X3BvaW50CiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQxID0iLCBtb3VudDEpCgogICAgbW91bnQyIDo9IHJlcGxhY2UobW91bnQxLCAiJChzcGF0aCkiLCBwb2xpY3lfZGF0YS5jb21tb24uc3BhdGgpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQyID0iLCBtb3VudDIpCgogICAgZGlyZWN0X3ZvbF9wYXRoIDo9IGlfc3RvcmFnZS5zb3VyY2UKICAgIG1vdW50MyA6PSByZXBsYWNlKG1vdW50MiwgIiQoYjY0LWRpcmVjdC12b2wtcGF0aCkiLCBiYXNlNjR1cmwuZW5jb2RlKGRpcmVjdF92b2xfcGF0aCkpCiAgICBwcmludCgiYWxsb3dfbW91bnRfcG9pbnQgNjogbW91bnQzID0iLCBtb3VudDMpCgogICAgbW91bnQzID09IGlfc3RvcmFnZS5tb3VudF9wb2ludAoKICAgIHByaW50KCJhbGxvd19tb3VudF9wb2ludCA2OiB0cnVlIikKfQoKYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAxOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJibGsiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMTogdHJ1ZSIpCn0KYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIocF9zdG9yYWdlLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19kaXJlY3Rfdm9sX2RyaXZlciAyOiBzdGFydCIpCiAgICBwX3N0b3JhZ2UuZHJpdmVyID09ICJzbWIiCiAgICBwcmludCgiYWxsb3dfZGlyZWN0X3ZvbF9kcml2ZXIgMjogdHJ1ZSIpCn0KCiMgcHJvY2Vzcy5DYXBhYmlsaXRpZXMKYWxsb3dfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBBbWJpZW50ID0iLCBwX2NhcHMuQW1iaWVudCkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBBbWJpZW50ID0iLCBpX2NhcHMuQW1iaWVudCkKICAgIG1hdGNoX2NhcHMocF9jYXBzLkFtYmllbnQsIGlfY2Fwcy5BbWJpZW50KQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgQm91bmRpbmcgPSIsIHBfY2Fwcy5Cb3VuZGluZykKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBCb3VuZGluZyA9IiwgaV9jYXBzLkJvdW5kaW5nKQogICAgbWF0Y2hfY2FwcyhwX2NhcHMuQm91bmRpbmcsIGlfY2Fwcy5Cb3VuZGluZykKCiAgICBwcmludCgiYWxsb3dfY2FwczogcG9saWN5IEVmZmVjdGl2ZSA9IiwgcF9jYXBzLkVmZmVjdGl2ZSkKICAgIHByaW50KCJhbGxvd19jYXBzOiBpbnB1dCBFZmZlY3RpdmUgPSIsIGlfY2Fwcy5FZmZlY3RpdmUpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5FZmZlY3RpdmUsIGlfY2Fwcy5FZmZlY3RpdmUpCgogICAgcHJpbnQoImFsbG93X2NhcHM6IHBvbGljeSBJbmhlcml0YWJsZSA9IiwgcF9jYXBzLkluaGVyaXRhYmxlKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IEluaGVyaXRhYmxlID0iLCBpX2NhcHMuSW5oZXJpdGFibGUpCiAgICBtYXRjaF9jYXBzKHBfY2Fwcy5Jbmhlcml0YWJsZSwgaV9jYXBzLkluaGVyaXRhYmxlKQoKICAgIHByaW50KCJhbGxvd19jYXBzOiBwb2xpY3kgUGVybWl0dGVkID0iLCBwX2NhcHMuUGVybWl0dGVkKQogICAgcHJpbnQoImFsbG93X2NhcHM6IGlucHV0IFBlcm1pdHRlZCA9IiwgaV9jYXBzLlBlcm1pdHRlZCkKICAgIG1hdGNoX2NhcHMocF9jYXBzLlBlcm1pdHRlZCwgaV9jYXBzLlBlcm1pdHRlZCkKfQoKbWF0Y2hfY2FwcyhwX2NhcHMsIGlfY2FwcykgewogICAgcHJpbnQoIm1hdGNoX2NhcHMgMTogc3RhcnQiKQoKICAgIHBfY2FwcyA9PSBpX2NhcHMKCiAgICBwcmludCgibWF0Y2hfY2FwcyAxOiB0cnVlIikKfQptYXRjaF9jYXBzKHBfY2FwcywgaV9jYXBzKSB7CiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiBzdGFydCIpCgogICAgY291bnQocF9jYXBzKSA9PSAxCiAgICBwX2NhcHNbMF0gPT0gIiQoZGVmYXVsdF9jYXBzKSIKCiAgICBwcmludCgibWF0Y2hfY2FwcyAyOiBkZWZhdWx0X2NhcHMgPSIsIHBvbGljeV9kYXRhLmNvbW1vbi5kZWZhdWx0X2NhcHMpCiAgICBwb2xpY3lfZGF0YS5jb21tb24uZGVmYXVsdF9jYXBzID09IGlfY2FwcwoKICAgIHByaW50KCJtYXRjaF9jYXBzIDI6IHRydWUiKQp9Cm1hdGNoX2NhcHMocF9jYXBzLCBpX2NhcHMpIHsKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHN0YXJ0IikKCiAgICBjb3VudChwX2NhcHMpID09IDEKICAgIHBfY2Fwc1swXSA9PSAiJChwcml2aWxlZ2VkX2NhcHMpIgoKICAgIHByaW50KCJtYXRjaF9jYXBzIDM6IHByaXZpbGVnZWRfY2FwcyA9IiwgcG9saWN5X2RhdGEuY29tbW9uLnByaXZpbGVnZWRfY2FwcykKICAgIHBvbGljeV9kYXRhLmNvbW1vbi5wcml2aWxlZ2VkX2NhcHMgPT0gaV9jYXBzCgogICAgcHJpbnQoIm1hdGNoX2NhcHMgMzogdHJ1ZSIpCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpX3BhdGgpIHsKICAgIGNvbnRhaW5zKGlfcGF0aCwgIi4uLyIpID09IGZhbHNlCiAgICBlbmRzd2l0aChpX3BhdGgsICIvLi4iKSA9PSBmYWxzZQogICAgaV9wYXRoICE9ICIuLiIKfQoKY2hlY2tfc3ltbGlua19zb3VyY2UgewogICAgIyBUT0RPOiBkZWxldGUgdGhpcyBydWxlIG9uY2UgdGhlIHN5bWxpbmtfc3JjIGZpZWxkIGdldHMgaW1wbGVtZW50ZWQKICAgICMgYnkgYWxsL21vc3QgR3Vlc3QgVk1zLgogICAgbm90IGlucHV0LnN5bWxpbmtfc3JjCn0KY2hlY2tfc3ltbGlua19zb3VyY2UgewogICAgaV9zcmMgOj0gaW5wdXQuc3ltbGlua19zcmMKICAgIHByaW50KCJjaGVja19zeW1saW5rX3NvdXJjZTogaV9zcmMgPSIsIGlfc3JjKQoKICAgIHN0YXJ0c3dpdGgoaV9zcmMsICIvIikgPT0gZmFsc2UKICAgIGNoZWNrX2RpcmVjdG9yeV90cmF2ZXJzYWwoaV9zcmMpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZXMoaV9zdG9yYWdlcykgewogICAgcHJpbnQoImFsbG93X3NhbmRib3hfc3RvcmFnZXM6IGlfc3RvcmFnZXMgPSIsIGlfc3RvcmFnZXMpCgogICAgcF9zdG9yYWdlcyA6PSBwb2xpY3lfZGF0YS5zYW5kYm94LnN0b3JhZ2VzCiAgICBldmVyeSBpX3N0b3JhZ2UgaW4gaV9zdG9yYWdlcyB7CiAgICAgICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlKHBfc3RvcmFnZXMsIGlfc3RvcmFnZSkKICAgIH0KCiAgICBwcmludCgiYWxsb3dfc2FuZGJveF9zdG9yYWdlczogdHJ1ZSIpCn0KCmFsbG93X3NhbmRib3hfc3RvcmFnZShwX3N0b3JhZ2VzLCBpX3N0b3JhZ2UpIHsKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IGlfc3RvcmFnZSA9IiwgaV9zdG9yYWdlKQoKICAgIHNvbWUgcF9zdG9yYWdlIGluIHBfc3RvcmFnZXMKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHBfc3RvcmFnZSA9IiwgcF9zdG9yYWdlKQogICAgaV9zdG9yYWdlID09IHBfc3RvcmFnZQoKICAgIHByaW50KCJhbGxvd19zYW5kYm94X3N0b3JhZ2U6IHRydWUiKQp9CgpDb3B5RmlsZVJlcXVlc3QgewogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogaW5wdXQucGF0aCA9IiwgaW5wdXQucGF0aCkKCiAgICBjaGVja19zeW1saW5rX3NvdXJjZQogICAgY2hlY2tfZGlyZWN0b3J5X3RyYXZlcnNhbChpbnB1dC5wYXRoKQoKICAgIHNvbWUgcmVnZXgxIGluIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuQ29weUZpbGVSZXF1ZXN0CiAgICByZWdleDIgOj0gcmVwbGFjZShyZWdleDEsICIkKHNmcHJlZml4KSIsIHBvbGljeV9kYXRhLmNvbW1vbi5zZnByZWZpeCkKICAgIHJlZ2V4MyA6PSByZXBsYWNlKHJlZ2V4MiwgIiQoY3BhdGgpIiwgcG9saWN5X2RhdGEuY29tbW9uLmNwYXRoKQogICAgcmVnZXg0IDo9IHJlcGxhY2UocmVnZXgzLCAiJChidW5kbGUtaWQpIiwgIlthLXowLTldezY0fSIpCiAgICBwcmludCgiQ29weUZpbGVSZXF1ZXN0OiByZWdleDQgPSIsIHJlZ2V4NCkKCiAgICByZWdleC5tYXRjaChyZWdleDQsIGlucHV0LnBhdGgpCgogICAgcHJpbnQoIkNvcHlGaWxlUmVxdWVzdDogdHJ1ZSIpCn0KCkNyZWF0ZVNhbmRib3hSZXF1ZXN0IHsKICAgIHByaW50KCJDcmVhdGVTYW5kYm94UmVxdWVzdDogaW5wdXQuZ3Vlc3RfaG9va19wYXRoID0iLCBpbnB1dC5ndWVzdF9ob29rX3BhdGgpCiAgICBjb3VudChpbnB1dC5ndWVzdF9ob29rX3BhdGgpID09IDAKCiAgICBwcmludCgiQ3JlYXRlU2FuZGJveFJlcXVlc3Q6IGlucHV0Lmtlcm5lbF9tb2R1bGVzID0iLCBpbnB1dC5rZXJuZWxfbW9kdWxlcykKICAgIGNvdW50KGlucHV0Lmtlcm5lbF9tb2R1bGVzKSA9PSAwCgogICAgaV9waWRucyA6PSBpbnB1dC5zYW5kYm94X3BpZG5zCiAgICBwcmludCgiQ3JlYXRlU2FuZGJveFJlcXVlc3Q6IGlfcGlkbnMgPSIsIGlfcGlkbnMpCiAgICBpX3BpZG5zID09IGZhbHNlCgogICAgYWxsb3dfc2FuZGJveF9zdG9yYWdlcyhpbnB1dC5zdG9yYWdlcykKfQoKRXhlY1Byb2Nlc3NSZXF1ZXN0IHsKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaW5wdXQgPSIsIGlucHV0KQoKICAgIGlfY29tbWFuZCA9IGNvbmNhdCgiICIsIGlucHV0LnByb2Nlc3MuQXJncykKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogaV9jb21tYW5kID0iLCBpX2NvbW1hbmQpCgogICAgc29tZSBwX2NvbW1hbmQgaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QuY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMTogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCiAgICBwX2NvbW1hbmQgPT0gaV9jb21tYW5kCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAxOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgIyBUT0RPOiBtYXRjaCBpbnB1dCBjb250YWluZXIgSUQgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBjb250YWluZXIuZXhlY19jb21tYW5kcy4KICAgIGlfY29tbWFuZCA9IGNvbmNhdCgiICIsIGlucHV0LnByb2Nlc3MuQXJncykKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogaV9jb21tYW5kID0iLCBpX2NvbW1hbmQpCgogICAgc29tZSBjb250YWluZXIgaW4gcG9saWN5X2RhdGEuY29udGFpbmVycwogICAgc29tZSBwX2NvbW1hbmQgaW4gY29udGFpbmVyLmV4ZWNfY29tbWFuZHMKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMjogcF9jb21tYW5kID0iLCBwX2NvbW1hbmQpCgogICAgIyBUT0RPOiBzaG91bGQgb3RoZXIgaW5wdXQgZGF0YSBmaWVsZHMgYmUgdmFsaWRhdGVkIGFzIHdlbGw/CiAgICBwX2NvbW1hbmQgPT0gaV9jb21tYW5kCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAyOiB0cnVlIikKfQpFeGVjUHJvY2Vzc1JlcXVlc3QgewogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpbnB1dCA9IiwgaW5wdXQpCgogICAgaV9jb21tYW5kID0gY29uY2F0KCIgIiwgaW5wdXQucHJvY2Vzcy5BcmdzKQogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiBpX2NvbW1hbmQgPSIsIGlfY29tbWFuZCkKCiAgICBzb21lIHBfcmVnZXggaW4gcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5FeGVjUHJvY2Vzc1JlcXVlc3QucmVnZXgKICAgIHByaW50KCJFeGVjUHJvY2Vzc1JlcXVlc3QgMzogcF9yZWdleCA9IiwgcF9yZWdleCkKCiAgICByZWdleC5tYXRjaChwX3JlZ2V4LCBpX2NvbW1hbmQpCgogICAgcHJpbnQoIkV4ZWNQcm9jZXNzUmVxdWVzdCAzOiB0cnVlIikKfQoKQ2xvc2VTdGRpblJlcXVlc3QgewogICAgcG9saWN5X2RhdGEucmVxdWVzdF9kZWZhdWx0cy5DbG9zZVN0ZGluUmVxdWVzdCA9PSB0cnVlCn0KClJlYWRTdHJlYW1SZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuUmVhZFN0cmVhbVJlcXVlc3QgPT0gdHJ1ZQp9CgpVcGRhdGVFcGhlbWVyYWxNb3VudHNSZXF1ZXN0IHsKICAgIHBvbGljeV9kYXRhLnJlcXVlc3RfZGVmYXVsdHMuVXBkYXRlRXBoZW1lcmFsTW91bnRzUmVxdWVzdCA9PSB0cnVlCn0KCldyaXRlU3RyZWFtUmVxdWVzdCB7CiAgICBwb2xpY3lfZGF0YS5yZXF1ZXN0X2RlZmF1bHRzLldyaXRlU3RyZWFtUmVxdWVzdCA9PSB0cnVlCn0KCnBvbGljeV9kYXRhIDo9IHsKICAiY29udGFpbmVycyI6IFsKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiA2NTUzNSwKICAgICAgICAgICAgIkdJRCI6IDY1NTM1LAogICAgICAgICAgICAiQWRkaXRpb25hbEdpZHMiOiBbXSwKICAgICAgICAgICAgIlVzZXJuYW1lIjogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiQXJncyI6IFsKICAgICAgICAgICAgIi9wYXVzZSIKICAgICAgICAgIF0sCiAgICAgICAgICAiRW52IjogWwogICAgICAgICAgICAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIlJvb3QiOiB7CiAgICAgICAgICAiUGF0aCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgIlJlYWRvbmx5IjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgIk1vdW50cyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9wcm9jIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJwcm9jIiwKICAgICAgICAgICAgInR5cGVfIjogInByb2MiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2IiwKICAgICAgICAgICAgInNvdXJjZSI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJ0bXBmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJzdHJpY3RhdGltZSIsCiAgICAgICAgICAgICAgIm1vZGU9NzU1IiwKICAgICAgICAgICAgICAic2l6ZT02NTUzNmsiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L3B0cyIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiZGV2cHRzIiwKICAgICAgICAgICAgInR5cGVfIjogImRldnB0cyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJuZXdpbnN0YW5jZSIsCiAgICAgICAgICAgICAgInB0bXhtb2RlPTA2NjYiLAogICAgICAgICAgICAgICJtb2RlPTA2MjAiLAogICAgICAgICAgICAgICJnaWQ9NSIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvc2htIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIvcnVuL2thdGEtY29udGFpbmVycy9zYW5kYm94L3NobSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9tcXVldWUiLAogICAgICAgICAgICAic291cmNlIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJtcXVldWUiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICAgICAibm9kZXYiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJzeXNmcyIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJzeXNmcyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJvIgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2V0Yy9yZXNvbHYuY29uZiIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiJChzZnByZWZpeClyZXNvbHYuY29uZiQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJvIiwKICAgICAgICAgICAgICAibm9zdWlkIiwKICAgICAgICAgICAgICAibm9kZXYiLAogICAgICAgICAgICAgICJub2V4ZWMiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9zYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJzYW5kYm94IiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWlkIjogIl5bYS16MC05XXs2NH0kIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LWxvZy1kaXJlY3RvcnkiOiAiXi92YXIvbG9nL3BvZHMvJChzYW5kYm94LW5hbWVzcGFjZSlfJChzYW5kYm94LW5hbWUpX1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLnNhbmRib3gtbmFtZSI6ICJzcGFyayIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lc3BhY2UiOiAiZGVmYXVsdCIsCiAgICAgICAgICAibmVyZGN0bC9uZXR3b3JrLW5hbWVzcGFjZSI6ICJeL3Zhci9ydW4vbmV0bnMvY25pLVswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQiCiAgICAgICAgfSwKICAgICAgICAiTGludXgiOiB7CiAgICAgICAgICAiTmFtZXNwYWNlcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogImlwYyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAidXRzIiwKICAgICAgICAgICAgICAiUGF0aCI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJtb3VudCIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgIk1hc2tlZFBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYWNwaSIsCiAgICAgICAgICAgICIvcHJvYy9hc291bmQiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3N5cy9maXJtd2FyZSIsCiAgICAgICAgICAgICIvcHJvYy9zY3NpIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYnVzIiwKICAgICAgICAgICAgIi9wcm9jL2ZzIiwKICAgICAgICAgICAgIi9wcm9jL2lycSIsCiAgICAgICAgICAgICIvcHJvYy9zeXMiLAogICAgICAgICAgICAiL3Byb2Mvc3lzcnEtdHJpZ2dlciIKICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIH0sCiAgICAgICJzdG9yYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogImJsayIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAidGFyIiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiJChoYXNoMCkiCiAgICAgICAgICBdLAogICAgICAgICAgIm1vdW50X3BvaW50IjogIiQobGF5ZXIwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNWE1YWFkODAwNTVmZjIwMDEyYTUwZGMyNWY4ZGY3YTI5OTI0NDc0MzI0ZDY1ZjdkNTMwNmVlOGVlMjdmZjcxZCIsCiAgICAgICAgICAgICI4MTcyNTBmMWEzZTMzNmRhNzZmNWJkM2ZhNzg0ZTFiMjZkOTU5YjljMTMxODc2ODE1YmEyNjA0MDQ4YjcwYzE4IgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGNwYXRoKS8kKGJ1bmRsZS1pZCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0KICAgICAgXSwKICAgICAgInNhbmRib3hfcGlkbnMiOiBmYWxzZSwKICAgICAgImV4ZWNfY29tbWFuZHMiOiBbXQogICAgfSwKICAgIHsKICAgICAgIk9DSSI6IHsKICAgICAgICAiVmVyc2lvbiI6ICIxLjEuMC1yYy4xIiwKICAgICAgICAiUHJvY2VzcyI6IHsKICAgICAgICAgICJUZXJtaW5hbCI6IGZhbHNlLAogICAgICAgICAgIlVzZXIiOiB7CiAgICAgICAgICAgICJVSUQiOiAwLAogICAgICAgICAgICAiR0lEIjogMCwKICAgICAgICAgICAgIkFkZGl0aW9uYWxHaWRzIjogW10sCiAgICAgICAgICAgICJVc2VybmFtZSI6ICIiCiAgICAgICAgICB9LAogICAgICAgICAgIkFyZ3MiOiBbCiAgICAgICAgICAgICIvYmluL3NoIgogICAgICAgICAgXSwKICAgICAgICAgICJFbnYiOiBbCiAgICAgICAgICAgICJQQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW46L2JpbjovdXNyL2xpYi9qdm0vamF2YS0xLjgtb3Blbmpkay9qcmUvYmluOi91c3IvbGliL2p2bS9qYXZhLTEuOC1vcGVuamRrL2Jpbjovb3B0L3NwYXJrL2JpbiIsCiAgICAgICAgICAgICJMQU5HPUMuVVRGLTgiLAogICAgICAgICAgICAiSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTEuOC1vcGVuamRrIiwKICAgICAgICAgICAgIkpBVkFfVkVSU0lPTj04dTIxMiIsCiAgICAgICAgICAgICJKQVZBX0FMUElORV9WRVJTSU9OPTguMjEyLjA0LXIwIiwKICAgICAgICAgICAgIkFQQUNIRV9TUEFSS19WRVJTSU9OPTIuNC4zIiwKICAgICAgICAgICAgIkhBRE9PUF9WRVJTSU9OPTMuMS4yIiwKICAgICAgICAgICAgIkhBRE9PUF9HSVRfQ09NTUlUPXJlbGVhc2UtMy4yLjAtUkMxIiwKICAgICAgICAgICAgIlNQQVJLX0hPTUU9L29wdC9zcGFyayIsCiAgICAgICAgICAgICJIQURPT1BfSE9NRT0vb3B0L2hhZG9vcCIsCiAgICAgICAgICAgICJIT1NUTkFNRT0kKGhvc3QtbmFtZSkiCiAgICAgICAgICBdLAogICAgICAgICAgIkN3ZCI6ICIvIiwKICAgICAgICAgICJDYXBhYmlsaXRpZXMiOiB7CiAgICAgICAgICAgICJBbWJpZW50IjogW10sCiAgICAgICAgICAgICJCb3VuZGluZyI6IFsKICAgICAgICAgICAgICAiJChkZWZhdWx0X2NhcHMpIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiRWZmZWN0aXZlIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJJbmhlcml0YWJsZSI6IFtdLAogICAgICAgICAgICAiUGVybWl0dGVkIjogWwogICAgICAgICAgICAgICIkKGRlZmF1bHRfY2FwcykiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiTm9OZXdQcml2aWxlZ2VzIjogZmFsc2UKICAgICAgICB9LAogICAgICAgICJSb290IjogewogICAgICAgICAgIlBhdGgiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJSZWFkb25seSI6IGZhbHNlCiAgICAgICAgfSwKICAgICAgICAiTW91bnRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Byb2MiLAogICAgICAgICAgICAic291cmNlIjogInByb2MiLAogICAgICAgICAgICAidHlwZV8iOiAicHJvYyIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYiLAogICAgICAgICAgICAic291cmNlIjogInRtcGZzIiwKICAgICAgICAgICAgInR5cGVfIjogInRtcGZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgInN0cmljdGF0aW1lIiwKICAgICAgICAgICAgICAibW9kZT03NTUiLAogICAgICAgICAgICAgICJzaXplPTY1NTM2ayIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvcHRzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICJkZXZwdHMiLAogICAgICAgICAgICAidHlwZV8iOiAiZGV2cHRzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5ld2luc3RhbmNlIiwKICAgICAgICAgICAgICAicHRteG1vZGU9MDY2NiIsCiAgICAgICAgICAgICAgIm1vZGU9MDYyMCIsCiAgICAgICAgICAgICAgImdpZD01IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL2Rldi9zaG0iLAogICAgICAgICAgICAic291cmNlIjogIi9ydW4va2F0YS1jb250YWluZXJzL3NhbmRib3gvc2htIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZGV2L21xdWV1ZSIsCiAgICAgICAgICAgICJzb3VyY2UiOiAibXF1ZXVlIiwKICAgICAgICAgICAgInR5cGVfIjogIm1xdWV1ZSIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9zeXMiLAogICAgICAgICAgICAic291cmNlIjogInN5c2ZzIiwKICAgICAgICAgICAgInR5cGVfIjogInN5c2ZzIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgIm5vc3VpZCIsCiAgICAgICAgICAgICAgIm5vZXhlYyIsCiAgICAgICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvc3lzL2ZzL2Nncm91cCIsCiAgICAgICAgICAgICJzb3VyY2UiOiAiY2dyb3VwIiwKICAgICAgICAgICAgInR5cGVfIjogImNncm91cCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgICAgICJub2V4ZWMiLAogICAgICAgICAgICAgICJub2RldiIsCiAgICAgICAgICAgICAgInJlbGF0aW1lIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RzIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RzJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9kZXYvdGVybWluYXRpb24tbG9nIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRlcm1pbmF0aW9uLWxvZyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicnciCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJkZXN0aW5hdGlvbiI6ICIvZXRjL2hvc3RuYW1lIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KWhvc3RuYW1lJCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJydyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi9ldGMvcmVzb2x2LmNvbmYiLAogICAgICAgICAgICAic291cmNlIjogIiQoc2ZwcmVmaXgpcmVzb2x2LmNvbmYkIiwKICAgICAgICAgICAgInR5cGVfIjogImJpbmQiLAogICAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgICAicmJpbmQiLAogICAgICAgICAgICAgICJycHJpdmF0ZSIsCiAgICAgICAgICAgICAgInJ3IgogICAgICAgICAgICBdCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiZGVzdGluYXRpb24iOiAiL3Zhci9ydW4vc2VjcmV0cy9rdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50IiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXNlcnZpY2VhY2NvdW50JCIsCiAgICAgICAgICAgICJ0eXBlXyI6ICJiaW5kIiwKICAgICAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAgICAgInJiaW5kIiwKICAgICAgICAgICAgICAicnByaXZhdGUiLAogICAgICAgICAgICAgICJybyIKICAgICAgICAgICAgXQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImRlc3RpbmF0aW9uIjogIi92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zIiwKICAgICAgICAgICAgInNvdXJjZSI6ICIkKHNmcHJlZml4KXRva2VucyQiLAogICAgICAgICAgICAidHlwZV8iOiAiYmluZCIsCiAgICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAgICJyYmluZCIsCiAgICAgICAgICAgICAgInJwcml2YXRlIiwKICAgICAgICAgICAgICAicm8iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJBbm5vdGF0aW9ucyI6IHsKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmJ1bmRsZV9wYXRoIjogIi9ydW4vY29udGFpbmVyZC9pby5jb250YWluZXJkLnJ1bnRpbWUudjIudGFzay9rOHMuaW8vJChidW5kbGUtaWQpIiwKICAgICAgICAgICJpby5rYXRhY29udGFpbmVycy5wa2cub2NpLmNvbnRhaW5lcl90eXBlIjogInBvZF9jb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmNvbnRhaW5lci1uYW1lIjogInNwYXJrIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5jb250YWluZXItdHlwZSI6ICJjb250YWluZXIiLAogICAgICAgICAgImlvLmt1YmVybmV0ZXMuY3JpLmltYWdlLW5hbWUiOiAibWNyLm1pY3Jvc29mdC5jb20vbW1sc3Bhcmsvc3BhcmsyLjQ6djRfbWluaSIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1pZCI6ICJeW2EtejAtOV17NjR9JCIsCiAgICAgICAgICAiaW8ua3ViZXJuZXRlcy5jcmkuc2FuZGJveC1uYW1lIjogInNwYXJrIiwKICAgICAgICAgICJpby5rdWJlcm5ldGVzLmNyaS5zYW5kYm94LW5hbWVzcGFjZSI6ICJkZWZhdWx0IgogICAgICAgIH0sCiAgICAgICAgIkxpbnV4IjogewogICAgICAgICAgIk5hbWVzcGFjZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiVHlwZSI6ICJpcGMiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJUeXBlIjogInV0cyIsCiAgICAgICAgICAgICAgIlBhdGgiOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIlR5cGUiOiAibW91bnQiLAogICAgICAgICAgICAgICJQYXRoIjogIiIKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJNYXNrZWRQYXRocyI6IFsKICAgICAgICAgICAgIi9wcm9jL2FjcGkiLAogICAgICAgICAgICAiL3Byb2Mva2NvcmUiLAogICAgICAgICAgICAiL3Byb2Mva2V5cyIsCiAgICAgICAgICAgICIvcHJvYy9sYXRlbmN5X3N0YXRzIiwKICAgICAgICAgICAgIi9wcm9jL3RpbWVyX2xpc3QiLAogICAgICAgICAgICAiL3Byb2MvdGltZXJfc3RhdHMiLAogICAgICAgICAgICAiL3Byb2Mvc2NoZWRfZGVidWciLAogICAgICAgICAgICAiL3Byb2Mvc2NzaSIsCiAgICAgICAgICAgICIvc3lzL2Zpcm13YXJlIgogICAgICAgICAgXSwKICAgICAgICAgICJSZWFkb25seVBhdGhzIjogWwogICAgICAgICAgICAiL3Byb2MvYXNvdW5kIiwKICAgICAgICAgICAgIi9wcm9jL2J1cyIsCiAgICAgICAgICAgICIvcHJvYy9mcyIsCiAgICAgICAgICAgICIvcHJvYy9pcnEiLAogICAgICAgICAgICAiL3Byb2Mvc3lzIiwKICAgICAgICAgICAgIi9wcm9jL3N5c3JxLXRyaWdnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICB9LAogICAgICAic3RvcmFnZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDApIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDIpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDMpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyMykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDQpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDUpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDYpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNikiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDcpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyNykiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDgpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyOCkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDkpIgogICAgICAgICAgXSwKICAgICAgICAgICJtb3VudF9wb2ludCI6ICIkKGxheWVyOSkiLAogICAgICAgICAgImZzX2dyb3VwIjogbnVsbAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImRyaXZlciI6ICJibGsiLAogICAgICAgICAgImRyaXZlcl9vcHRpb25zIjogW10sCiAgICAgICAgICAic291cmNlIjogIiIsCiAgICAgICAgICAiZnN0eXBlIjogInRhciIsCiAgICAgICAgICAib3B0aW9ucyI6IFsKICAgICAgICAgICAgIiQoaGFzaDEwKSIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChsYXllcjEwKSIsCiAgICAgICAgICAiZnNfZ3JvdXAiOiBudWxsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAiZHJpdmVyIjogIm92ZXJsYXlmcyIsCiAgICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAgICJzb3VyY2UiOiAiIiwKICAgICAgICAgICJmc3R5cGUiOiAiZnVzZTMua2F0YS1vdmVybGF5IiwKICAgICAgICAgICJvcHRpb25zIjogWwogICAgICAgICAgICAiNjg5ODZjMmY4NDhlYmM0MWM4NTYxY2IxYzVkMzAyODg3NjQyOTk0NDhiMDMzZWQ2ZWJiMjU3YTQzZTMxYTNiOTo1NmQzNDA2NmRhMGQ5OWU3NjJmNjM3ZDBkMzJkOTVlNTQ2MjIzNjlmMDQ4ZTI4OWUzN2RiMDJiZTE5NzUzMzA1OjBlZjJiZTU0ODVmOGU3YzVjOGEyMDE1MjFiZjA4NjE5N2FhOWJkMWQ5NDk3ZmE4NTBmNzZlZTFkZWI3NzcyYmI6NDAzM2VlNmE3NzIzM2MwZDNiNDMzZDM5MDkyZTA5OTY4Mzc5OTRlZWYyYmQxZjFmOTJiODU4Y2U2NDM3Mzk2ZjowZjA4YjM4MTE3YmUwYTI3YjFkNDNkMzk1NGYyMTA0MmFlNDNmMDJhMTAwZTA5ZWQwZjQzNzBjZTUzZjNhMjYyOjM1YTI4OWMzMTZmMWRlNTAyMTcyZTRhOGQ5ZTE1MzEzM2JhY2E0YmVjYjM4YjA3MDg4MDA3NjRkY2NjNDYyNTE6ZjQ2YjA0YjQ5YTdlMDdmY2JiYmUzNDI5MDI3NDQ0ZmIyMDM0YjdmZDhkM2E1OWU2Njc4YjMyOWFiMmI2NTc2Mzo3ZTFhYjNiMjcwNWVmMzc5NGIyYzg0NmNiYWM3NTcxNDRkMmE0MGQzODNiM2QzYzg1ZTI3YTVkOGMzOWM4NGYxOjAxMmIxODYwYWY5MDc1MzdlMTE0YWUzOGQ5MjViY2UxZWFhZjNkMWQ4NzgxZmRjMWY3N2VmODI4YzhiNGUyYmI6MmI4NjNmYTI1NzU2MWM1OWYxOWZlZGE0YjViZTA1YTg3MWZmZGRkMzMwNmZkNDNlNWMwNDA1MWQ0ODQyOTliYjo1YTI4Nzk3YWJhNTcyM2JlZjA3NDc3YWM5ZGI2Mzc2NzAxZTEzMzM1MjQxZTJiYjVjNjdkZjQ2NGRjY2UxMTJkIiwKICAgICAgICAgICAgIjljNWU5ZTY1M2QyNmVkNTIzZjAyMmJkMjllMTllOTI2NzM1OTk5NWQ1YTBjOGZkMjI3NTZmODRjYWQ1NDVkM2Y6NmJkYWVmNTY4MjQ0NDUyOWZmZDYyNDI4MGRiYWQxYWY3NTc5NjNkNmI0NGQ2MTRjYjZjYTkxMWYzOWI1ZjgwMzo1YWRhOTdhZTI1ZDliZmQxMjgzMzYzOTdiODU3ZTFhMDdkY2UyMTM3YmZhYjA3NTcxYmY0MWY5ZDQwZDdiNTkwOjViNzdjNmRmNjgzODEwM2E4NTg3ODdjOWNlNDg2NWI2ZDExYmJkZDk4NjE2OWVkMDhlMDM2MmFjNmZkZTRkNzQ6OGNiZjQ1OTVmMGUxMWQ4MDY1MzEwZDJhZDA0NmU3MTEzNDk3NWQwMDZhMDY5OTMxYzNmZjcxZjU3NTQ5NDhhMDowNTAwNGRjM2ExMWM4MmU4YzgwYWY0NmFiYWU3MjhjZDZjZWJmZmMzNDAxODFhNDkzMTBhZGJjYzRkNzZiMTM4OjNlYTVhNjQzZDg4NjAwMjk0ZTJhMzdjZDllZWJkMTRlMTc1ODAzNTJkMTRmZWQzMmJmZTUxZmJkZjAzZGRkNDU6MjU4MTg3ZGU1NWFmMWZjZTdjODExNGE1ODIyZTA0NjU5ZjkxNTk2YjBhOWMwZjQ3YWQ1N2I5NGNjZGNmN2ZjMjphN2RiMjhlMDllNTFlODliNDUxYzJkMWZkZTIxYjAxNmI2NWJhNDhjYTczMzEwOWFhZDBkNWVhYmQxOTFiMDJiOjc5MGJiNTFlNTk1ODEzN2JmYzE1ZDhhMmNhNjkzZWQ3ZWZmNjZmNGZjNDY5MTExNGNmMTdiZjFmZDUxYzEyZWU6MTIwNTUzMjZjMjc1NDA1YTE5MjA2MjEzNzQ2OTg4OGUxYTQ5OGNkODI5YTVjNTFiYzBkZGNjMTg4MGExMGJjMyIKICAgICAgICAgIF0sCiAgICAgICAgICAibW91bnRfcG9pbnQiOiAiJChjcGF0aCkvJChidW5kbGUtaWQpIiwKICAgICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJzYW5kYm94X3BpZG5zIjogZmFsc2UsCiAgICAgICJleGVjX2NvbW1hbmRzIjogW10KICAgIH0KICBdLAogICJjb21tb24iOiB7CiAgICAiY3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2hhcmVkL2NvbnRhaW5lcnMiLAogICAgInNmcHJlZml4IjogIl4kKGNwYXRoKS8kKGJ1bmRsZS1pZCktW2EtejAtOV17MTZ9LSIsCiAgICAic3BhdGgiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zdG9yYWdlIiwKICAgICJpcHY0X2EiOiAiKCgyNVswLTVdfCgyWzAtNF18MVxcZHxbMS05XXwpXFxkKVxcLj9cXGIpezR9IiwKICAgICJpcF9wIjogIlswLTldezEsNX0iLAogICAgInN2Y19uYW1lIjogIltBLVowLTlfXFwuXFwtXSsiLAogICAgImRuc19sYWJlbCI6ICJbYS16QS1aMC05X1xcLlxcLV0rIiwKICAgICJkZWZhdWx0X2NhcHMiOiBbCiAgICAgICJDQVBfQ0hPV04iLAogICAgICAiQ0FQX0RBQ19PVkVSUklERSIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9GT1dORVIiLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9ORVRfUkFXIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VURkNBUCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTkVUX0JJTkRfU0VSVklDRSIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfS0lMTCIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiCiAgICBdLAogICAgInByaXZpbGVnZWRfY2FwcyI6IFsKICAgICAgIkNBUF9DSE9XTiIsCiAgICAgICJDQVBfREFDX09WRVJSSURFIiwKICAgICAgIkNBUF9EQUNfUkVBRF9TRUFSQ0giLAogICAgICAiQ0FQX0ZPV05FUiIsCiAgICAgICJDQVBfRlNFVElEIiwKICAgICAgIkNBUF9LSUxMIiwKICAgICAgIkNBUF9TRVRHSUQiLAogICAgICAiQ0FQX1NFVFVJRCIsCiAgICAgICJDQVBfU0VUUENBUCIsCiAgICAgICJDQVBfTElOVVhfSU1NVVRBQkxFIiwKICAgICAgIkNBUF9ORVRfQklORF9TRVJWSUNFIiwKICAgICAgIkNBUF9ORVRfQlJPQURDQVNUIiwKICAgICAgIkNBUF9ORVRfQURNSU4iLAogICAgICAiQ0FQX05FVF9SQVciLAogICAgICAiQ0FQX0lQQ19MT0NLIiwKICAgICAgIkNBUF9JUENfT1dORVIiLAogICAgICAiQ0FQX1NZU19NT0RVTEUiLAogICAgICAiQ0FQX1NZU19SQVdJTyIsCiAgICAgICJDQVBfU1lTX0NIUk9PVCIsCiAgICAgICJDQVBfU1lTX1BUUkFDRSIsCiAgICAgICJDQVBfU1lTX1BBQ0NUIiwKICAgICAgIkNBUF9TWVNfQURNSU4iLAogICAgICAiQ0FQX1NZU19CT09UIiwKICAgICAgIkNBUF9TWVNfTklDRSIsCiAgICAgICJDQVBfU1lTX1JFU09VUkNFIiwKICAgICAgIkNBUF9TWVNfVElNRSIsCiAgICAgICJDQVBfU1lTX1RUWV9DT05GSUciLAogICAgICAiQ0FQX01LTk9EIiwKICAgICAgIkNBUF9MRUFTRSIsCiAgICAgICJDQVBfQVVESVRfV1JJVEUiLAogICAgICAiQ0FQX0FVRElUX0NPTlRST0wiLAogICAgICAiQ0FQX1NFVEZDQVAiLAogICAgICAiQ0FQX01BQ19PVkVSUklERSIsCiAgICAgICJDQVBfTUFDX0FETUlOIiwKICAgICAgIkNBUF9TWVNMT0ciLAogICAgICAiQ0FQX1dBS0VfQUxBUk0iLAogICAgICAiQ0FQX0JMT0NLX1NVU1BFTkQiLAogICAgICAiQ0FQX0FVRElUX1JFQUQiLAogICAgICAiQ0FQX1BFUkZNT04iLAogICAgICAiQ0FQX0JQRiIsCiAgICAgICJDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFIgogICAgXSwKICAgICJ2aXJ0aW9fYmxrX3N0b3JhZ2VfY2xhc3NlcyI6IFsKICAgICAgImNjLWxvY2FsLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLWNzaSIsCiAgICAgICJjYy1tYW5hZ2VkLXByZW1pdW0tY3NpIgogICAgXSwKICAgICJzbWJfc3RvcmFnZV9jbGFzc2VzIjogWwogICAgICAiY2MtYXp1cmVmaWxlLWNzaSIsCiAgICAgICJjYy1henVyZWZpbGUtcHJlbWl1bS1jc2kiCiAgICBdCiAgfSwKICAic2FuZGJveCI6IHsKICAgICJzdG9yYWdlcyI6IFsKICAgICAgewogICAgICAgICJkcml2ZXIiOiAiZXBoZW1lcmFsIiwKICAgICAgICAiZHJpdmVyX29wdGlvbnMiOiBbXSwKICAgICAgICAic291cmNlIjogInNobSIsCiAgICAgICAgImZzdHlwZSI6ICJ0bXBmcyIsCiAgICAgICAgIm9wdGlvbnMiOiBbCiAgICAgICAgICAibm9leGVjIiwKICAgICAgICAgICJub3N1aWQiLAogICAgICAgICAgIm5vZGV2IiwKICAgICAgICAgICJtb2RlPTE3NzciLAogICAgICAgICAgInNpemU9NjcxMDg4NjQiCiAgICAgICAgXSwKICAgICAgICAibW91bnRfcG9pbnQiOiAiL3J1bi9rYXRhLWNvbnRhaW5lcnMvc2FuZGJveC9zaG0iLAogICAgICAgICJmc19ncm91cCI6IG51bGwKICAgICAgfQogICAgXQogIH0sCiAgInJlcXVlc3RfZGVmYXVsdHMiOiB7CiAgICAiQ3JlYXRlQ29udGFpbmVyUmVxdWVzdCI6IHsKICAgICAgImFsbG93X2Vudl9yZWdleCI6IFsKICAgICAgICAiXkhPU1ROQU1FPSQoZG5zX2xhYmVsKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUD10Y3A6Ly8kKGlwdjRfYSk6JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfUE9SVF8kKGlwX3ApX1RDUF9QUk9UTz10Y3AkIiwKICAgICAgICAiXiQoc3ZjX25hbWUpX1BPUlRfJChpcF9wKV9UQ1BfUE9SVD0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUXyQoaXBfcClfVENQX0FERFI9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX0hPU1Q9JChpcHY0X2EpJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9TRVJWSUNFX1BPUlQ9JChpcF9wKSQiLAogICAgICAgICJeJChzdmNfbmFtZSlfU0VSVklDRV9QT1JUXyQoZG5zX2xhYmVsKT0kKGlwX3ApJCIsCiAgICAgICAgIl4kKHN2Y19uYW1lKV9QT1JUPXRjcDovLyQoaXB2NF9hKTokKGlwX3ApJCIsCiAgICAgICAgIl5BWlVSRV9DTElFTlRfSUQ9W0EtRmEtZjAtOS1dKiQiLAogICAgICAgICJeQVpVUkVfVEVOQU5UX0lEPVtBLUZhLWYwLTktXSokIiwKICAgICAgICAiXkFaVVJFX0ZFREVSQVRFRF9UT0tFTl9GSUxFPS92YXIvcnVuL3NlY3JldHMvYXp1cmUvdG9rZW5zL2F6dXJlLWlkZW50aXR5LXRva2VuJCIsCiAgICAgICAgIl5BWlVSRV9BVVRIT1JJVFlfSE9TVD1odHRwczovL2xvZ2luXFwubWljcm9zb2Z0b25saW5lXFwuY29tLyQiCiAgICAgIF0KICAgIH0sCiAgICAiQ29weUZpbGVSZXF1ZXN0IjogWwogICAgICAiJChzZnByZWZpeCkiCiAgICBdLAogICAgIkV4ZWNQcm9jZXNzUmVxdWVzdCI6IHsKICAgICAgImNvbW1hbmRzIjogW10sCiAgICAgICJyZWdleCI6IFtdCiAgICB9LAogICAgIkNsb3NlU3RkaW5SZXF1ZXN0IjogZmFsc2UsCiAgICAiUmVhZFN0cmVhbVJlcXVlc3QiOiB0cnVlLAogICAgIlVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QiOiBmYWxzZSwKICAgICJXcml0ZVN0cmVhbVJlcXVlc3QiOiBmYWxzZQogIH0KfQ== spec: restartPolicy: Never - runtimeClassName: runtime-class + runtimeClassName: kata-cc containers: - name: spark image: "mcr.microsoft.com/mmlspark/spark2.4:v4_mini" diff --git a/src/agent/src/main.rs b/src/agent/src/main.rs index bfa7382069e8..a8c5101091cf 100644 --- a/src/agent/src/main.rs +++ b/src/agent/src/main.rs @@ -343,14 +343,9 @@ async fn start_sandbox( s.rtnl.handle_localhost().await?; } - // - When init_mode is true, enabling the localhost link during the - // handle_localhost call above is required before starting OPA with the - // initialize_policy call below. - // - When init_mode is false, the Policy could be initialized earlier, - // because initialize_policy doesn't start OPA. OPA is started by - // systemd after localhost has been enabled. + // TODO: initialize earlier. #[cfg(feature = "agent-policy")] - if let Err(e) = initialize_policy(init_mode).await { + if let Err(e) = initialize_policy().await { error!(logger, "Failed to initialize agent policy: {:?}", e); // Continuing execution without a security policy could be dangerous. std::process::abort(); @@ -418,14 +413,11 @@ fn init_agent_as_init(logger: &Logger, unified_cgroup_hierarchy: bool) -> Result } #[cfg(feature = "agent-policy")] -async fn initialize_policy(init_mode: bool) -> Result<()> { - let opa_addr = "localhost:8181"; - let agent_policy_path = "/agent_policy"; - let default_agent_policy = "/etc/kata-opa/default-policy.rego"; +async fn initialize_policy() -> Result<()> { AGENT_POLICY .lock() .await - .initialize(init_mode, opa_addr, agent_policy_path, default_agent_policy) + .initialize("/etc/kata-opa/default-policy.rego") .await } diff --git a/src/agent/src/policy.rs b/src/agent/src/policy.rs index 33501beddce8..6742d3688c1a 100644 --- a/src/agent/src/policy.rs +++ b/src/agent/src/policy.rs @@ -6,23 +6,16 @@ use anyhow::{bail, Result}; use nix::sys::stat; use protobuf::MessageDyn; -use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; use slog::Drain; use std::ffi::OsStr; use std::os::unix::ffi::OsStrExt; use std::path::PathBuf; use tokio::io::AsyncWriteExt; -use tokio::time::{sleep, Duration}; use crate::rpc::ttrpc_error; use crate::AGENT_POLICY; -static EMPTY_JSON_INPUT: &str = "{\"input\":{}}"; - -static OPA_DATA_PATH: &str = "/data"; -static OPA_POLICIES_PATH: &str = "/policies"; - static POLICY_LOG_FILE: &str = "/tmp/policy.txt"; /// Convenience macro to obtain the scope logger @@ -33,14 +26,21 @@ macro_rules! sl { } async fn allow_request(policy: &mut AgentPolicy, ep: &str, request: &str) -> ttrpc::Result<()> { - if !policy.allow_request(ep, request).await { - warn!(sl!(), "{ep} is blocked by policy"); - Err(ttrpc_error( - ttrpc::Code::PERMISSION_DENIED, - format!("{ep} is blocked by policy"), - )) - } else { - Ok(()) + match policy.allow_request(ep, request).await { + Ok((allowed, prints)) => { + if allowed { + Ok(()) + } else { + Err(ttrpc_error( + ttrpc::Code::PERMISSION_DENIED, + format!("{ep} is blocked by policy: {prints}"), + )) + } + } + Err(e) => Err(ttrpc_error( + ttrpc::Code::INTERNAL, + format!("{ep}: internal error {e}"), + )), } } @@ -107,32 +107,17 @@ pub async fn do_set_policy(req: &protocols::agent::SetPolicyRequest) -> ttrpc::R .map_err(|e| ttrpc_error(ttrpc::Code::INVALID_ARGUMENT, e)) } -/// Example of HTTP response from OPA: {"result":true} -#[derive(Debug, Serialize, Deserialize)] -struct AllowResponse { - result: bool, -} - /// Singleton policy object. #[derive(Debug, Default)] pub struct AgentPolicy { /// When true policy errors are ignored, for debug purposes. allow_failures: bool, - /// OPA path used to query if an Agent gRPC request should be allowed. - /// The request name (e.g., CreateContainerRequest) must be added to - /// this path. - query_path: String, - - /// OPA path used to add or delete a rego format Policy. - policy_path: String, - - /// Client used to connect a single time to the OPA service and reused - /// for all the future communication with OPA. - opa_client: Option, - /// "/tmp/policy.txt" log file for policy activity. log_file: Option, + + /// Regorus engine + engine: regorus::Engine, } impl AgentPolicy { @@ -140,18 +125,20 @@ impl AgentPolicy { pub fn new() -> Self { Self { allow_failures: false, + engine: Self::new_engine(), ..Default::default() } } - /// Wait for OPA to start and connect to it. - pub async fn initialize( - &mut self, - launch_opa: bool, - opa_addr: &str, - policy_name: &str, - default_policy: &str, - ) -> Result<()> { + fn new_engine() -> regorus::Engine { + let mut engine = regorus::Engine::new(); + engine.set_strict_builtin_errors(false); + engine.set_gather_prints(true); + engine + } + + /// Initialize regorus. + pub async fn initialize(&mut self, default_policy_file: &str) -> Result<()> { if sl!().is_enabled(slog::Level::Debug) { self.log_file = Some( tokio::fs::OpenOptions::new() @@ -164,159 +151,46 @@ impl AgentPolicy { debug!(sl!(), "policy: log file: {}", POLICY_LOG_FILE); } - if launch_opa { - start_opa(opa_addr)?; - } - - let opa_uri = format!("http://{opa_addr}/v1"); - self.query_path = format!("{opa_uri}{OPA_DATA_PATH}{policy_name}/"); - self.policy_path = format!("{opa_uri}{OPA_POLICIES_PATH}{policy_name}"); - let opa_client = reqwest::Client::builder().http1_only().build()?; - let policy = tokio::fs::read_to_string(default_policy).await?; - - // This loop is necessary to get the opa_client connected to the - // OPA service while that service is starting. Future requests to - // OPA are expected to work without retrying, after connecting - // successfully for the first time. - for i in 0..50 { - if i > 0 { - sleep(Duration::from_millis(100)).await; - debug!(sl!(), "policy initialize: PUT failed, retrying"); - } - - // Set-up the default policy. - if opa_client - .put(&self.policy_path) - .body(policy.clone()) - .send() - .await - .is_ok() - { - self.opa_client = Some(opa_client); - - // Check if requests causing policy errors should actually - // be allowed. That is an insecure configuration but is - // useful for allowing insecure pods to start, then connect to - // them and inspect Guest logs for the root cause of a failure. - // - // Note that post_query returns Ok(false) in case - // AllowRequestsFailingPolicy was not defined in the policy. - self.allow_failures = self - .post_query("AllowRequestsFailingPolicy", EMPTY_JSON_INPUT) - .await?; - return Ok(()); - } - } - bail!("Failed to connect to OPA") + self.engine.add_policy_from_file(default_policy_file)?; + self.engine.set_input_json("{}")?; + self.allow_failures = match self.allow_request("AllowRequestsFailingPolicy", "{}").await { + Ok((allowed, _prints)) => allowed, + Err(_) => false, + }; + Ok(()) } - /// Ask OPA to check if an API call should be allowed or not. - async fn allow_request(&mut self, ep: &str, request: &str) -> bool { - let post_input = format!("{{\"input\":{request}}}"); - self.log_opa_input(ep, &post_input).await; - match self.post_query(ep, &post_input).await { - Err(e) => { - debug!( - sl!(), - "policy: failed to query endpoint {}: {:?}. Returning false.", ep, e - ); - false - } - Ok(allowed) => allowed, - } - } + /// Ask regorus if an API call should be allowed or not. + 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; - /// Replace the Policy in OPA. - pub async fn set_policy(&mut self, policy: &str) -> Result<()> { - check_policy_hash(policy)?; + let query = format!("data.agent_policy.{ep}"); + self.engine.set_input_json(ep_input)?; - if let Some(opa_client) = &mut self.opa_client { - // Delete the old rules. - opa_client.delete(&self.policy_path).send().await?; - - // Put the new rules. - opa_client - .put(&self.policy_path) - .body(policy.to_string()) - .send() - .await?; - - // Check if requests causing policy errors should actually be allowed. - // That is an insecure configuration but is useful for allowing insecure - // pods to start, then connect to them and inspect Guest logs for the - // root cause of a failure. - // - // Note that post_query returns Ok(false) in case - // AllowRequestsFailingPolicy was not defined in the policy. - self.allow_failures = self - .post_query("AllowRequestsFailingPolicy", EMPTY_JSON_INPUT) - .await?; - - Ok(()) - } else { - bail!("Agent Policy is not initialized") + let mut allow = self.engine.eval_bool_query(query, false)?; + if !allow && self.allow_failures { + allow = true; } - } - // Post query to OPA. - async fn post_query(&mut self, ep: &str, post_input: &str) -> Result { - debug!(sl!(), "policy check: {ep}"); + let prints = match self.engine.take_prints() { + Ok(p) => p.join(" "), + Err(e) => format!("Failed to get policy log: {e}"), + }; - if let Some(opa_client) = &mut self.opa_client { - let uri = format!("{}{ep}", &self.query_path); - let response = opa_client - .post(uri) - .body(post_input.to_string()) - .send() - .await?; - - if response.status() != http::StatusCode::OK { - bail!("policy: POST {} response status {}", ep, response.status()); - } + Ok((allow, prints)) + } - let http_response = response.text().await?; - let opa_response: serde_json::Result = - serde_json::from_str(&http_response); - - match opa_response { - Ok(resp) => { - if !resp.result { - if self.allow_failures { - warn!( - sl!(), - "policy: POST {} response <{}>. Ignoring error!", ep, http_response - ); - return Ok(true); - } else { - error!(sl!(), "policy: POST {} response <{}>", ep, http_response); - } - } - Ok(resp.result) - } - Err(_) => { - if self.allow_failures { - warn!( - sl!(), - "policy: POST {} undefined response <{}>. Ignoring error!", - ep, - http_response - ); - return Ok(true); - } else { - warn!( - sl!(), - "policy: POST {} undefined response <{}>.", ep, http_response - ); - } - Ok(false) - } - } - } else { - bail!("Agent Policy is not initialized") - } + /// 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())?; + Ok(()) } - async fn log_opa_input(&mut self, ep: &str, input: &str) { + async fn log_eval_input(&mut self, ep: &str, input: &str) { if let Some(log_file) = &mut self.log_file { match ep { "StatsContainerRequest" | "ReadStreamRequest" | "SetPolicyRequest" => { @@ -331,9 +205,9 @@ impl AgentPolicy { 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_opa_input: write_all failed: {}", e); + warn!(sl!(), "policy: log_eval_input: write_all failed: {}", e); } else if let Err(e) = log_file.flush().await { - warn!(sl!(), "policy: log_opa_input: flush failed: {}", e); + warn!(sl!(), "policy: log_eval_input: flush failed: {}", e); } } } @@ -341,27 +215,6 @@ impl AgentPolicy { } } -fn start_opa(opa_addr: &str) -> Result<()> { - let bin_dirs = vec!["/bin", "/usr/bin", "/usr/local/bin"]; - for bin_dir in &bin_dirs { - let opa_path = bin_dir.to_string() + "/opa"; - if std::fs::metadata(&opa_path).is_ok() { - // args copied from kata-opa.service.in. - std::process::Command::new(&opa_path) - .arg("run") - .arg("--server") - .arg("--disable-telemetry") - .arg("--addr") - .arg(opa_addr) - .arg("--log-level") - .arg("info") - .spawn()?; - return Ok(()); - } - } - bail!("OPA binary not found in {:?}", &bin_dirs); -} - pub fn check_policy_hash(policy: &str) -> Result<()> { let mut hasher = Sha256::new(); hasher.update(policy.as_bytes());