diff --git a/analyses/hello-clusters/01_perform-evaluate-clustering.Rmd b/analyses/hello-clusters/01_perform-evaluate-clustering.Rmd
index 9ff802c2d..2c6ad5928 100644
--- a/analyses/hello-clusters/01_perform-evaluate-clustering.Rmd
+++ b/analyses/hello-clusters/01_perform-evaluate-clustering.Rmd
@@ -2,8 +2,6 @@
title: "Performing graph-based clustering with rOpenScPCA"
date: "`r Sys.Date()`"
author: "Data Lab"
-params:
- seed: 2024
output:
html_notebook:
toc: yes
@@ -48,7 +46,7 @@ suppressPackageStartupMessages({
Because clustering involves random sampling, it is important to set the random seed at the top of your analysis script or notebook to ensure reproducibilty.
```{r set seed}
-set.seed(params$seed)
+set.seed(2024)
```
### Paths
diff --git a/analyses/hello-clusters/01_perform-evaluate-clustering.nb.html b/analyses/hello-clusters/01_perform-evaluate-clustering.nb.html
index 59c34fc78..aeb5dfa90 100644
--- a/analyses/hello-clusters/01_perform-evaluate-clustering.nb.html
+++ b/analyses/hello-clusters/01_perform-evaluate-clustering.nb.html
@@ -2965,8 +2965,8 @@
Set the random seed
reproducibilty.
-
-set.seed(params$seed)
+
+set.seed(2024)
@@ -3876,7 +3876,7 @@ Session Info
-LS0tCnRpdGxlOiAiUGVyZm9ybWluZyBncmFwaC1iYXNlZCBjbHVzdGVyaW5nIHdpdGggck9wZW5TY1BDQSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgphdXRob3I6ICJEYXRhIExhYiIKcGFyYW1zOgogIHNlZWQ6IDIwMjQKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyMgSW50cm9kdWN0aW9uCgpUaGlzIG5vdGVib29rIHByb3ZpZGVzIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgZnVuY3Rpb25zIGluIGByT3BlblNjUENBYCB0aGF0OgoKKiBQZXJmb3JtIGNsdXN0ZXJpbmcKKiBDYWxjdWxhdGUgUUMgbWV0cmljcyBvbiBjbHVzdGVycywgaW5jbHVkaW5nOgogICogU2lsaG91ZXR0ZSB3aWR0aAogICogTmVpZ2hib3Job29kIHB1cml0eQogICogQ2x1c3RlciBzdGFiaWxpdHksIGFzIG1lYXN1cmVkIHdpdGggdGhlIEFkanVzdGVkIFJhbmQgSW5kZXgKKiBDYWxjdWxhdGUgUUMgbWV0cmljcyBvbiBjbHVzdGVycyBvYnRhaW5lZCB3aXRoIG90aGVyIHRvb2xzLCBzdWNoIGFzIGBTZXVyYXRgCiogU2F2ZSBjbHVzdGVyaW5nIHJlc3VsdHMgdG8gYW4gU0NFIG9yIGBTZXVyYXRgCgpXaGlsZSB0aGlzIG5vdGVib29rIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIHRoYXQgY2FsY3VsYXRlIGhlbHBmdWwgbWV0cmljcyBmb3IgZXZhbHVhdGluZyBjbHVzdGVyaW5nIHJlc3VsdHMsIGEgZnVsbCBldmFsdWF0aW9uIHdvdWxkIGNvbXBhcmUgdGhlc2UgbWV0cmljcyBhY3Jvc3MgZGlmZmVyZW50IGNsdXN0ZXJpbmdzIGZyb20gZGlmZmVyZW50IHBhcmFtZXRlcml6YXRpb25zLgoKVGhpcyBub3RlYm9vayB3aWxsIHVzZSB0aGUgc2FtcGxlIGBTQ1BDUzAwMDAwMWAgZnJvbSBwcm9qZWN0IGBTQ1BDUDAwMDAwMWAsIHdoaWNoIGlzIGFzc3VtZWQgcHJlc2VudCBpbiB0aGUgYE9wZW5TY1BDQS1hbmFseXNpcy9kYXRhL2N1cnJlbnQvU0NQQ1AwMDAwMDFgIGRpcmVjdG9yeSwgZm9yIGFsbCBleGFtcGxlcy4KUGxlYXNlIFtzZWUgdGhpcyBkb2N1bWVudGF0aW9uXShodHRwczovL29wZW5zY3BjYS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2FjY2Vzc2luZy1yZXNvdXJjZXMvZ2V0dGluZy1hY2Nlc3MtdG8tZGF0YS8pIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9idGFpbmluZyBTY1BDQSBkYXRhLgoKIyMgU2V0dXAKCiMjIyBQYWNrYWdlcwoKCmBgYHtyIHBhY2thZ2VzfQpsaWJyYXJ5KHJPcGVuU2NQQ0EpCgpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCiAgbGlicmFyeShTZXVyYXQpCiAgbGlicmFyeShkcGx5cikKfSkKYGBgCgojIyMgU2V0IHRoZSByYW5kb20gc2VlZAoKQmVjYXVzZSBjbHVzdGVyaW5nIGludm9sdmVzIHJhbmRvbSBzYW1wbGluZywgaXQgaXMgaW1wb3J0YW50IHRvIHNldCB0aGUgcmFuZG9tIHNlZWQgYXQgdGhlIHRvcCBvZiB5b3VyIGFuYWx5c2lzIHNjcmlwdCBvciBub3RlYm9vayB0byBlbnN1cmUgcmVwcm9kdWNpYmlsdHkuCgpgYGB7ciBzZXQgc2VlZH0Kc2V0LnNlZWQocGFyYW1zJHNlZWQpCmBgYAoKIyMjIFBhdGhzCgpgYGB7ciBiYXNlIHBhdGhzfQojIFRoZSBiYXNlIHBhdGggZm9yIHRoZSBPcGVuU2NQQ0EgcmVwb3NpdG9yeQpyZXBvc2l0b3J5X2Jhc2UgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290Ojppc19naXRfcm9vdCkKCiMgVGhlIGN1cnJlbnQgZGF0YSBkaXJlY3RvcnksIGZvdW5kIHdpdGhpbiB0aGUgcmVwb3NpdG9yeSBiYXNlIGRpcmVjdG9yeQpkYXRhX2RpciA8LSBmaWxlLnBhdGgocmVwb3NpdG9yeV9iYXNlLCAiZGF0YSIsICJjdXJyZW50IikKCiMgVGhlIHBhdGggdG8gdGhpcyBtb2R1bGUKbW9kdWxlX2Jhc2UgPC0gZmlsZS5wYXRoKHJlcG9zaXRvcnlfYmFzZSwgImFuYWx5c2VzIiwgImhlbGxvLWNsdXN0ZXJzIikKYGBgCgojIyMgSW5wdXQgZmlsZQoKYGBge3IgcGF0aHN9CiMgUGF0aCB0byBwcm9jZXNzZWQgU0NFIGZpbGUgZm9yIHNhbXBsZSBTQ1BDUzAwMDAwMQppbnB1dF9zY2VfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJTQ1BDUDAwMDAwMSIsICJTQ1BDUzAwMDAwMSIsICJTQ1BDTDAwMDAwMV9wcm9jZXNzZWQucmRzIikKYGBgCgoKIyMgUmVhZCBpbiBhbmQgcHJlcGFyZSBkYXRhCgpUbyBiZWdpbiwgd2UnbGwgcmVhZCBpbiB0aGUgYFNpbmdsZUNlbGxFeHBlcmltZW50YCAoU0NFKSBvYmplY3QuCldlJ2xsIGFsc28gZXN0YWJsaXNoIGEgY29ycmVzcG9uZGluZyBwcm9jZXNzZWQgU2V1cmF0IG9iamVjdCBmcm9tIGl0cyByYXcgY291bnRzIHRoYXQgd2UnbGwgdXNlIGZvciBzb21lIGV4YW1wbGVzLgoKYGBge3IgcmVhZCBkYXRhfQojIFJlYWQgdGhlIFNDRSBmaWxlCnNjZSA8LSByZWFkUkRTKGlucHV0X3NjZV9maWxlKQpgYGAKCmBgYHtyIGNyZWF0ZSBwcm9jZXNzIHNldXJhdCwgbWVzc2FnZSA9IEZBTFNFfQojIENvbnZlcnQgdG8gYSBTZXVyYXQgb2JqZWN0CnNldXJhdF9vYmogPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KGNvdW50cyA9IGNvdW50cyhzY2UpLCBhc3NheSA9ICJSTkEiKQoKIyBQcm9jZXNzIHRoZSBvYmplY3Qgd2l0aCBhIFNldXJhdCBwaXBlbGluZSB0byBvYnRhaW4gY2x1c3RlcnMKc2V1cmF0X29iaiA8LSBzZXVyYXRfb2JqIHw+CiAgU0NUcmFuc2Zvcm0oKSB8PgogIFJ1blBDQSgpIHw+CiAgRmluZE5laWdoYm9ycygpIHw+CiAgRmluZENsdXN0ZXJzKCkKYGBgCgoKV2UnbGwgYWxzbyBleHRyYWN0IGl0cyBQQ0EgbWF0cml4LCB3aGljaCB3ZSdsbCB1c2UgdG8gZGVtb25zdHJhdGUgaG93IHRvIGNhbGN1bGF0ZSBhbmQgZXZhbHVhdGUgY2x1c3RlcnMuCldlJ2xsIHNob3cgaG93IHRvIGRvIHRoaXMgZm9yIGJvdGggU0NFIGFuZCBTZXVyYXQgb2JqZWN0czoKCgpgYGB7ciBleHRyYWN0IHBjYSBkYXRhfQojIEV4dHJhY3QgdGhlIFBDQSBtYXRyaXggZnJvbSBhbiBTQ0Ugb2JqZWN0CiMgTW92aW5nIGZvcndhcmQsIHdlJ2xsIHVzZSB0aGlzIHZlcnNpb24gZm9yIG1vc3QgZXhhbXBsZXMKcGNhX21hdHJpeCA8LSByZWR1Y2VkRGltKHNjZSwgIlBDQSIpCgoKIyBFeHRyYWN0IHRoZSBQQ0EgbWF0cml4IGZyb20gYSBTZXVyYXQgb2JqZWN0CnNldXJhdF9wY2FfbWF0cml4IDwtIEVtYmVkZGluZ3Moc2V1cmF0X29iaiwgcmVkdWN0aW9uID0gInBjYSIpCmBgYAoKIyMgUGVyZm9ybSBjbHVzdGVyaW5nCgpUaGlzIHNlY3Rpb24gd2lsbCBzaG93IGhvdyB0byBwZXJmb3JtIGNsdXN0ZXJpbmcgd2l0aCB0aGUgZnVuY3Rpb24gYHJPcGVuU2NQQ0E6OmNhbGN1bGF0ZV9jbHVzdGVycygpYC4gCgpUaGlzIGZ1bmN0aW9uIHRha2VzIGEgUENBIG1hdHJpeCB3aXRoIHJvd25hbWVzIHJlcHJlc2VudGluZyB1bmlxdWUgY2VsbCBpZHMgKGUuZy4sIGJhcmNvZGVzKSBhcyBpdHMgcHJpbWFyeSBhcmd1bWVudC4KQnkgZGVmYXVsdCBpdCB3aWxsIGNhbGN1bGF0ZSBjbHVzdGVycyB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CgoqIExvdXZhaW4gYWxnb3JpdGhtCiogSmFjY2FyZCB3ZWlnaHRpbmcKKiAxMCBuZWFyZXN0IG5laWdoYm9ycwoqIEEgcmVzb2x1dGlvbiBwYXJhbWV0ZXIgb2YgMQoKVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBjb2x1bW5zOgoKKiBgY2VsbF9pZGA6IFVuaXF1ZSBjZWxsIGlkZW50aWZpZXJzLCBvYnRhaW5lZCBmcm9tIHRoZSBQQ0EgbWF0cml4J3Mgcm93IG5hbWVzCiogYGNsdXN0ZXJgOiBBIGZhY3RvciBjb2x1bW4gd2l0aCB0aGUgY2x1c3RlciBpZGVudGl0aWVzCiogVGhlcmUgd2lsbCBiZSBvbmUgY29sdW1uIGZvciBlYWNoIGNsdXN0ZXJpbmcgcGFyYW1ldGVyIHVzZWQKCgojIyMgQ2x1c3RlcmluZyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycwoKYGBge3IgY2x1c3RlciBzY2V9CiMgQ2FsY3VsYXRlIGNsdXN0ZXJzIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzCmNsdXN0ZXJfcmVzdWx0c19kZiA8LSBjYWxjdWxhdGVfY2x1c3RlcnMocGNhX21hdHJpeCkKCiMgUHJpbnQgcmVzdWx0aW5nIHRhYmxlCmNsdXN0ZXJfcmVzdWx0c19kZgpgYGAKCiMjIyBDbHVzdGVyaW5nIHdpdGggbm9uLWRlZmF1bHQgcGFyYW1ldGVycwoKUGFyYW1ldGVycyB1c2VkIGZvciBjbHVzdGVyaW5nIGNhbiBiZSBjdXN0b21pemVkIHdpdGggdGhlc2UgYXJndW1lbnRzOgoKKiBUaGUgYGFsZ29yaXRobWAgY2FuIGJlIG9uZSBvZjoKICAqIGBsb3V2YWluYCwgYHdhbGt0cmFwYCwgb3IgYGxlaWRlbmAKKiBUaGUgYHdlaWdodGluZ2AgY2FuIGJlIG9uZSBvZjoKICAqIGBqYWNjYXJkYCwgYHJhbmtgLCBvciBgbnVtYmVyYAoqIFRoZSBuZWFyZXN0IG5laWdoYm9ycyBwYXJhbWV0ZXIgY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aCB0aGUgYG5uYCBhcmd1bWVudAoqIFRoZSByZXNvbHV0aW9uIHBhcmFtZXRlciBjYW4gYmUgY3VzdG9taXplZCB3aXRoIHRoZSBgcmVzb2x1dGlvbmAgYXJndW1lbnQKICAqIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBieSBMb3V2YWluIGFuZCBMZWlkZW4gYWxnb3JpdGhtcwoqIElmIHRoZSBMZWlkZW4gYWxnb3JpdGhtIGlzIHVzZWQsIGl0cyBkZWZhdWx0IG9iamVjdGl2ZSBmdW5jdGlvbiBwYXJhbWV0ZXIgd2lsbCBiZSBgQ1BNYCwgYnV0IHlvdSBjYW4gYWxzbyBzZXQgIGBvYmplY3RpdmVfZnVuY3Rpb24gPSAibW9kdWxhcml0eSJgIGluc3RlYWQuCiogWW91IGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcyBhIGxpc3QgdG8gdGhlIGBjbHVzdGVyX2FyZ3NgIGFyZ3VtZW50LgogICogUGxlYXNlIHJlZmVyIHRvIHRoZSBbYGlncmFwaGAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9pZ3JhcGgub3JnL3IvaHRtbC9sYXRlc3QpIHRvIGxlYXJuIG1vcmUgYWJvdXQgd2hhdCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgY2FuIGJlIHByb3ZpZGVkIHRvIGVhY2ggY2x1c3RlcmluZyBhbGdvcml0aG0uCiAgKiBOb3RlIHRoYXQgYGNsdXN0ZXJfYXJnc2Agb25seSBhY2NlcHRzIHNpbmdsZS1sZW5ndGggYXJndW1lbnRzIChubyB2ZWN0b3JzIG9yIGxpc3RzKS4KCkZvciBleGFtcGxlOgoKYGBge3IgY2x1c3RlciBzY2Ugbm9uZGVmYXVsdH0KIyBDYWxjdWxhdGUgY2x1c3RlcnMgd2l0aCBub24tZGVmYXVsdCBwYXJhbWV0ZXJzCmNsdXN0ZXJfcmVzdWx0c19kZiA8LSBjYWxjdWxhdGVfY2x1c3RlcnMoCiAgcGNhX21hdHJpeCwKICBhbGdvcml0aG0gPSAibGVpZGVuIiwKICBubiA9IDE1LAogIG9iamVjdGl2ZV9mdW5jdGlvbiA9ICJtb2R1bGFyaXR5IgopCgojIFByaW50IHJlc3VsdGluZyB0YWJsZQpjbHVzdGVyX3Jlc3VsdHNfZGYKYGBgCgoKIyMgQ2FsY3VsYXRlIFFDIG1ldHJpY3Mgb24gY2x1c3RlcnMKClRoaXMgc2VjdGlvbiBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBzZXZlcmFsIGZ1bmN0aW9ucyBmb3IgZXZhbHVhdGluZyBjbHVzdGVyIHF1YWxpdHkgYW5kIHJlbGlhYmlsaXR5LiAKSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGEgZnVsbCBldmFsdWF0aW9uIG9mIGNsdXN0ZXJpbmcgcmVzdWx0cyB3b3VsZCBjb21wYXJlIHRoZXNlIG1ldHJpY3MgYWNyb3NzIGEgc2V0IG9mIGNsdXN0ZXJpbmcgcmVzdWx0cywgd2l0aCB0aGUgYWltIG9mIGlkZW50aWZ5aW5nIGFuIG9wdGltYWwgcGFyYW1ldGVyaXphdGlvbi4KCkFsbCBmdW5jdGlvbnMgcHJlc2VudGVkIGluIHRoaXMgc2VjdGlvbiB0YWtlIHRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgYXJndW1lbnRzOgoKKiBBIFBDQSBtYXRyaXggd2l0aCByb3cgbmFtZXMgcmVwcmVzZW50aW5nIHVuaXF1ZSBjZWxsIGlkcyAoZS5nLiwgYmFyY29kZXMpCiogQSBkYXRhIGZyYW1lIHdpdGgsIGF0IGxlYXN0LCBjb2x1bW5zIHJlcHJlc2VudGluZyB1bmlxdWUgY2VsbCBpZHMgYW5kIGNsdXN0ZXIgYXNzaWdubWVudHMKICAqIEJ5IGRlZmF1bHQsIHRoZXNlIGNvbHVtbnMgc2hvdWxkIGJlIG5hbWVkIGBjZWxsX2lkYCBhbmQgYGNsdXN0ZXJgLCByZXNwZWN0aXZlbHksIG1hdGNoaW5nIHRoZSBvdXRwdXQgb2YgYHJPcGVuU2NQQ0E6OmNhbGN1bGF0ZV9jbHVzdGVycygpYAogICogWW91IGNhbiBvdmVycmlkZSB0aGVzZSBkZWZhdWx0cyB1c2luZyB0aGUgYXJndW1lbnRzIGBjZWxsX2lkX2NvbGAgYW5kIGBjbHVzdGVyX2NvbGAKCiMjIyBTaWxob3VldHRlIHdpZHRoCgpTaWxob3VldHRlIHdpZHRoIGlzIGEgY29tbW9uIG1ldHJpYyB0aGF0IG1lYXN1cmVzIGhvdyB3ZWxsIHNlcGFyYXRlZCBjbHVzdGVycyBhcmUgYnksIGZvciBlYWNoIGNlbGwsIGNvbXBhcmluZyB0aGUgYXZlcmFnZSBkaXN0YW5jZSB0byBhbGwgY2VsbHMgaW4gdGhlIHNhbWUgY2x1c3RlciwgYW5kIGFsbCBjZWxscyBpbiBvdGhlciBjbHVzdGVycy4KVGhpcyB2YWx1ZSByYW5nZXMgZnJvbSAtMSB0byAxLgpDZWxscyBpbiB3ZWxsLXNlcGFyYXRlZCBjbHVzdGVycyBzaG91bGQgaGF2ZSBoaWdoIHNpbGhvdWV0dGUgdmFsdWVzIGNsb3NlciB0byAxLgpZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCBzaWxob3VldHRlIHdpZHRoIHB1cml0eSBmcm9tIHRoZSBbX09yY2hlc3RyYXRpbmcgU2luZ2xlIENlbGwgQW5hbHlzaXMgd2l0aCBCaW9jb25kdWN0b3JfIGJvb2tdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EuYWR2YW5jZWQvY2x1c3RlcmluZy1yZWR1eC5odG1sI3NpbGhvdWV0dGUtd2lkdGgpLgoKV2UnbGwgdXNlIHRoZSBmdW5jdGlvbiBgck9wZW5TY1BDQTo6Y2FsY3VsYXRlX3NpbGhvdWV0dGUoKWAgdG8gY2FsY3VsYXRlIHRoZSBzaWxob3VldHRlIHdpZHRoLgoKVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaW5wdXR0ZWQgZGF0YSBmcmFtZSB3aXRoIHR3byBhZGRpdGlvbmFsIGNvbHVtbnM6CgoqIGBzaWxob3VldHRlX3dpZHRoYDogVGhlIGNhbGN1bGF0ZWQgc2lsaG91ZXR0ZSB3aWR0aCBmb3IgdGhlIGNlbGwKKiBgc2lsaG91ZXR0ZV9vdGhlcmA6IFRoZSBjbG9zZXQgY2x1c3RlciB0byB0aGUgY2VsbCBiZXNpZGVzIHRoZSBjbHVzdGVyIHRvIHdoaWNoIGl0IGJlbG9uZ3MsIGFzIHVzZWQgaW4gdGhlIHNpbGhvdWV0dGUgd2lkdGggY2FsY3VsYXRpb24KCgpgYGB7ciBzaWxob3VldHRlfQojIGNhbGN1bGF0ZSB0aGUgc2lsaG91ZXR0ZSB3aWR0aCBmb3IgZWFjaCBjZWxsCnNpbGhvdWV0dGVfcmVzdWx0cyA8LSBjYWxjdWxhdGVfc2lsaG91ZXR0ZSgKICBwY2FfbWF0cml4LAogIGNsdXN0ZXJfcmVzdWx0c19kZgopCgojIHByaW50IHJlc3VsdApzaWxob3VldHRlX3Jlc3VsdHMKYGBgCgoKIyMjIE5laWdoYm9yaG9vZCBwdXJpdHkKCk5laWdoYm9yaG9vZCBwdXJpdHkgaXMgZGVmaW5lZCwgZm9yIGVhY2ggY2VsbCwgYXMgdGhlIHByb3BvcnRpb24gb2YgbmVpZ2hib3JpbmcgY2VsbHMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgY2x1c3Rlci4KVGhpcyB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIDEuCkNlbGxzIGluIHdlbGwtc2VwYXJhdGVkIGNsdXN0ZXJzIHNob3VsZCBoYXZlIGhpZ2ggcHVyaXR5IHZhbHVlcyBjbG9zZXIgdG8gMSwgc2luY2UgdGhlcmUgc2hvdWxkIGJlIG1pbmltYWwgb3ZlcmxhcCBiZXR3ZWVuIG1lbWJlciBhbmQgbmVpZ2hib3JpbmcgY2VsbHMuCllvdSBjYW4gcmVhZCBtb3JlIGFib3V0IG5laWdoYm9yaG9vZCBwdXJpdHkgZnJvbSB0aGUgW19PcmNoZXN0cmF0aW5nIFNpbmdsZSBDZWxsIEFuYWx5c2lzIHdpdGggQmlvY29uZHVjdG9yXyBib29rXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvMy4xOS9PU0NBLmFkdmFuY2VkL2NsdXN0ZXJpbmctcmVkdXguaHRtbCNjbHVzdGVyLXB1cml0eSkuCgpXZSdsbCB1c2UgdGhlIGZ1bmN0aW9uIGByT3BlblNjUENBOjpjYWxjdWxhdGVfcHVyaXR5KClgIHRvIGNhbGN1bGF0ZSB0aGUgbmVpZ2hib3Job29kIHB1cml0eS4KClRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGlucHV0dGVkIGRhdGEgZnJhbWUgd2l0aCB0d28gYWRkaXRpb25hbCBjb2x1bW5zOgoKKiBgcHVyaXR5YDogVGhlIG5laWdoYm9yaG9vZCBwdXJpdHkgZm9yIHRoZSBjZWxsCiogYG1heGltdW1fbmVpZ2hib3JgOiBUaGUgY2x1c3RlciB3aXRoIHRoZSBoaWdoZXN0IHByb3BvcnRpb24gb2Ygb2JzZXJ2YXRpb25zIG5laWdoYm9yaW5nIHRoZSBjZWxsCgoKYGBge3IgcHVyaXR5fQojIGNhbGN1bGF0ZSB0aGUgbmVpZ2hib3Job29kIHB1cml0eSBmb3IgZWFjaCBjZWxsCnB1cml0eV9yZXN1bHRzIDwtIGNhbGN1bGF0ZV9wdXJpdHkoCiAgcGNhX21hdHJpeCwKICBjbHVzdGVyX3Jlc3VsdHNfZGYKKQoKIyBwcmludCByZXN1bHQKcHVyaXR5X3Jlc3VsdHMKYGBgCgojIyMgQ2x1c3RlciBzdGFiaWxpdHkKCkFub3RoZXIgYXBwcm9hY2ggdG8gZXhwbG9yaW5nIGNsdXN0ZXIgcXVhbGl0eSBpcyBob3cgc3RhYmxlIHRoZSBjbHVzdGVycyB0aGVtc2VsdmVzIGFyZSB1c2luZyBib290c3RyYXBwaW5nLiAKR2l2ZW4gYSBzZXQgb2Ygb3JpZ2luYWwgY2x1c3RlcnMsIHdlIGNhbiBjb21wYXJlIHRoZSBib290c3RyYXBwZWQgY2x1c3RlciBpZGVudGl0aWVzIHRvIG9yaWdpbmFsIG9uZXMgdXNpbmcgdGhlIEFkanVzdGVkIFJhbmQgSW5kZXggKEFSSSksIHdoaWNoIG1lYXN1cmVzIHRoZSBzaW1pbGFyaXR5IG9mIHR3byBkYXRhIGNsdXN0ZXJpbmdzLgpBUkkgcmFuZ2VzIGZyb20gLTEgdG8gMSwgd2hlcmU6CgoqIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgdGhleSBhcmUgY29tcGxldGVseSBvdmVybGFwcGluZwoqIEEgdmFsdWUgb2YgLTEgaW5kaWNhdGVzIHRoZXkgYXJlIGNvbXBsZXRlbHkgZGlzdGluY3QKKiBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIGEgcmFuZG9tIHJlbGF0aW9uc2hpcAoKV2UgZXhwZWN0IHRoYXQgaGlnaGx5IHN0YWJsZSBjbHVzdGVyaW5ncyBoYXZlIEFSSSB2YWx1ZXMgY2xvc2VyIHRvIDEgYWNyb3NzIGEgc2V0IG9mIGJvb3RzdHJhcCByZXBsaWNhdGVzLgoKWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgdGhlIEFkanVzdGVkIFJhbmQgSW5kZXggZnJvbSB0aGUgW19PcmNoZXN0cmF0aW5nIFNpbmdsZSBDZWxsIEFuYWx5c2lzIHdpdGggQmlvY29uZHVjdG9yXyBib29rXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvYm9va3MvcmVsZWFzZS9PU0NBLmFkdmFuY2VkL2NsdXN0ZXJpbmctcmVkdXguaHRtbCNhZGp1c3RlZC1yYW5kLWluZGV4KS4KCldlJ2xsIHVzZSB0aGUgZnVuY3Rpb24gYHJPcGVuU2NQQ0E6OmNhbGN1bGF0ZV9zdGFiaWxpdHkoKWAgdG8gY2FsY3VsYXRlIHRoZSBjbHVzdGVyIHN0YWJpbGl0eS4KQnkgZGVmYXVsdCwgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyMCBib290c3RyYXAgcmVwbGljYXRlcywgYnV0IHRoaXMgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIGFyZ3VtZW50IGByZXBsaWNhdGVzYC4KClRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBkYXRhIGZyYW1lIHdpdGggY29sdW1ucyBgcmVwbGljYXRlYCwgYGFyaWAsIGFuZCBhZGRpdGlvbmFsIGNvbHVtbnMgZm9yIHRoZSBjbHVzdGVyaW5nIHBhcmFtZXRlcnMgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIGJvb3RzdHJhcCBjbHVzdGVycy4KCmBgYHtyIHN0YWJpbGl0eSwgd2FybmluZz1GQUxTRX0KIyBjYWxjdWxhdGUgdGhlIHN0YWJpbGl0eSBvZiBjbHVzdGVycwpzdGFiaWxpdHlfcmVzdWx0cyA8LSBjYWxjdWxhdGVfc3RhYmlsaXR5KAogIHBjYV9tYXRyaXgsCiAgY2x1c3Rlcl9yZXN1bHRzX2RmCikKCiMgcHJpbnQgdGhlIHJlc3VsdApzdGFiaWxpdHlfcmVzdWx0cwpgYGAKCiMjIyMgVXNpbmcgbm9uLWRlZmF1bHQgY2x1c3RlcmluZyBwYXJhbWV0ZXJzCgpXaGVuIGNhbGN1bGF0aW5nIGJvb3RzdHJhcCBjbHVzdGVycywgYHJPcGVuU2NQQ0E6OmNhbGN1bGF0ZV9zdGFiaWxpdHkoKWAgdXNlcyBgck9wZW5TY1BDQTo6Y2FsY3VsYXRlX2NsdXN0ZXJzKClgIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLiAKSWYgeW91ciBvcmlnaW5hbCBjbHVzdGVycyB3ZXJlIG5vdCBjYWxjdWxhdGVkIHdpdGggdGhlc2UgZGVmYXVsdHMsIHlvdSBzaG91bGQgcGFzcyB0aG9zZSBjdXN0b21pemVkIHZhbHVlcyBpbnRvIHRoaXMgZnVuY3Rpb24gYXMgd2VsbCB0byBlbnN1cmUgYSBmYWlyIGNvbXBhcmlzb24gYmV0d2VlbiB5b3VyIG9yaWdpbmFsIGNsdXN0ZXJzIGFuZCB0aGUgYm9vdHN0cmFwIGNsdXN0ZXJzLgoKCmBgYHtyIHN0YWJpbGl0eSBjdXN0b20gcGFyYW1ldGVyc30KIyBDYWxjdWxhdGUgY2x1c3RlcnMgd2l0aCBub24tZGVmYXVsdCBwYXJhbWV0ZXJzCmNsdXN0ZXJfZGZfbGVpZGVuIDwtIGNhbGN1bGF0ZV9jbHVzdGVycygKICBwY2FfbWF0cml4LAogIGFsZ29yaXRobSA9ICJsZWlkZW4iLAogIHJlc29sdXRpb24gPSAwLjUsCiAgbm4gPSAxNQopCgojIE5vdywgcGFzcyBpbiB0aGUgc2FtZSBhcmd1bWVudHMgY3VzdG9taXppbmcgcGFyYW1ldGVycyBoZXJlCnN0YWJpbGl0eV9yZXN1bHRzX2xlaWRlbiA8LSBjYWxjdWxhdGVfc3RhYmlsaXR5KAogIHBjYV9tYXRyaXgsCiAgY2x1c3Rlcl9kZl9sZWlkZW4sCiAgYWxnb3JpdGhtID0gImxlaWRlbiIsCiAgcmVzb2x1dGlvbiA9IDAuNSwKICBubiA9IDE1CikKCnN0YWJpbGl0eV9yZXN1bHRzX2xlaWRlbgpgYGAKCgoKIyMgIENhbGN1bGF0ZSBRQyBtZXRyaWNzIG9uIGV4aXN0aW5nIGNsdXN0ZXJzCgpFdmVuIGlmIHlvdSBwZXJmb3JtIGNsdXN0ZXJpbmcgd2l0aCBvdGhlciB0b29scywgeW91IGNhbiBzdGlsbCB1c2UgdGhlIGByT3BlblNjUENBYCBmdW5jdGlvbnMgdG8gZXZhbHVhdGUgeW91ciBjbHVzdGVycy4KCkluIHRoaXMgc2VjdGlvbiwgd2UnbGwgcHJlc2VudCBleGFtcGxlcyBvZiBob3cgeW91IGNhbiBjYWxjdWxhdGUgdGhlIHNpbGhvdWV0dGUgd2lkdGgsIG5laWdoYm9yaG9vZCBwdXJpdHksIGFuZCBjbHVzdGVyIHN0YWJpbGl0eSBmcm9tIGV4aXN0aW5nIGNsdXN0ZXIgYXNzaWdubWVudHMuCgojIyMgRXZhbHVhdGluZyBTZXVyYXQgY2x1c3RlcnMKCklmIHlvdSBhcmUgYW5hbHl6aW5nIHlvdXIgZGF0YSB3aXRoIGEgU2V1cmF0IHBpcGVsaW5lIHRoYXQgaW5jbHVkZXMgY2FsY3VsYXRpbmcgY2x1c3RlcnMsIHlvdSBjYW4gdXNlIGByT3BlblNjUENBYCB0byBldmFsdWF0ZSB0aGVtLgpXZSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBTZXVyYXQgb2JqZWN0IGNhbGxlZCBgc2V1cmF0X29iamAgd2l0aCBjbHVzdGVyczoKCgpgYGB7ciBzaG93IHNldXJhdCBjbHVzdGVyc30KaGVhZChzZXVyYXRfb2JqJHNldXJhdF9jbHVzdGVycykKYGBgCgpUbyBjYWxjdWxhdGUgUUMgbWV0cmljcyBvbiB0aGVzZSBjbHVzdGVycywgd2UnbGwgbmVlZCB0d28gcGllY2VzIG9mIGluZm9ybWF0aW9uOgoKLSBUaGUgUENBIG1hdHJpeAotIEEgZGF0YSBmcmFtZSB3aXRoIGNvbHVtbnMgYGNlbGxfaWRgIGFuZCBgY2x1c3RlcmAKCldlJ2xsIGNyZWF0ZSB0aG9zZSBoZXJlOgoKYGBge3IgcHJlcGFyZSBzZXVyYXQgaW5wdXR9CiMgRXh0cmFjdCB0aGUgUENBIG1hdHJpeCBmcm9tIHRoZSBTZXVyYXQgb2JqZWN0CnNldXJhdF9wY2FfbWF0cml4IDwtIEVtYmVkZGluZ3Moc2V1cmF0X29iaiwgcmVkdWN0aW9uID0gInBjYSIpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgZm9yIGlucHV0CnNldXJhdF9jbHVzdGVyX2RmIDwtIGRhdGEuZnJhbWUoCiAgY2VsbF9pZCA9IG5hbWVzKHNldXJhdF9vYmokc2V1cmF0X2NsdXN0ZXJzKSwKICBjbHVzdGVyID0gc2V1cmF0X29iaiRzZXVyYXRfY2x1c3RlcnMKKQpgYGAKCk5vdywgd2UgY2FuIHJ1biBgY2FsY3VsYXRlX3NpbGhvdWV0dGUoKWAgYW5kIGBjYWxjdWxhdGVfcHVyaXR5KClgOgoKYGBge3Igc2V1cmF0IHNpbGhvdWV0dGV9CnNldXJhdF9zaWxob3VldHRlX2RmIDwtIGNhbGN1bGF0ZV9zaWxob3VldHRlKAogIHNldXJhdF9wY2FfbWF0cml4LAogIHNldXJhdF9jbHVzdGVyX2RmCikKc2V1cmF0X3NpbGhvdWV0dGVfZGYKYGBgCgpgYGB7ciBzZXVyYXQgcHVyaXR5fQpzZXVyYXRfcHVyaXR5X2RmIDwtIGNhbGN1bGF0ZV9wdXJpdHkoCiAgc2V1cmF0X3BjYV9tYXRyaXgsCiAgc2V1cmF0X2NsdXN0ZXJfZGYKKQpzZXVyYXRfcHVyaXR5X2RmCmBgYAoKV2UgZG8gbm90IHJlY29tbWVuZCB1c2luZyBgck9wZW5TY1BDQTo6Y2FsY3VsYXRlX3N0YWJpbGl0eSgpYCBvbiBTZXVyYXQgY2x1c3RlcnMgZHVlIHRvIGRpZmZlcmVuY2VzIGluIHRoZSB1bmRlcmx5aW5nIGNsdXN0ZXJpbmcgYXBwcm9hY2ggYmV0d2VlbiBTZXVyYXQgYW5kIHRoZSBgYmx1c3RlcmAgcGFja2FnZSB3aGljaCBgck9wZW5TY1BDQWAgdXNlcy4KCiMjIyBFdmFsdWF0aW5nIFNjUENBIGNsdXN0ZXJzCgpTY1BDQSBjZWxsIG1ldGFkYXRhIGFscmVhZHkgY29udGFpbnMgYSBjb2x1bW4gY2FsbGVkIGBjbHVzdGVyYCB3aXRoIHJlc3VsdHMgZnJvbSBhbiBhdXRvbWF0ZWQgY2x1c3RlcmluZy4gClRoZXNlIGNsdXN0ZXJzIHdlcmUgY2FsY3VsYXRlZCB1c2luZyBgYmx1c3RlcmAsIHRoZSBzYW1lIHRvb2wgdGhhdCBgck9wZW5TY1BDQWAgdXNlcywgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CgoqIFRoZSBMb3V2YWluIGFsZ29yaXRobQoqIEphY2NhcmQgd2VpZ2h0aW5nCiogMjAgbmVhcmVzdCBuZWlnaGJvcnMKCkluIHRoaXMgZXhhbXBsZSwgd2UnbGwgc2hvdyBob3cgdG8gdXNlIHRoZSBjbHVzdGVyIGV2YWx1YXRpb24gZnVuY3Rpb25zIG9uIHRoZXNlIGNsdXN0ZXJzLgoKVG8gYmVnaW4sIHdlJ2xsIHByZXBhcmUgYSBkYXRhIGZyYW1lIHdpdGggdHdvIGNvbHVtbnM6IGBjZWxsX2lkYCBjb250YWluaW5nIGNlbGwgYmFyY29kZXMsIGFuZCBgY2x1c3RlcmAgY29udGFpbmluZyB0aGUgY2x1c3RlciBpZGVudGl0aWVzLgoKYGBge3IgcHJlcGFyZSBzY3BjYSBkYXRhIGZyYW1lfQpzY3BjYV9jbHVzdGVyX2RmIDwtIGRhdGEuZnJhbWUoCiAgY2VsbF9pZCA9IGNvbG5hbWVzKHNjZSksCiAgY2x1c3RlciA9IGNvbERhdGEoc2NlKSRjbHVzdGVyCikKCnNjcGNhX2NsdXN0ZXJfZGYKYGBgCgpXZSBjYW4gcnVuIGV2YWx1YXRpb24gZnVuY3Rpb25zIHVzaW5nIHRoaXMgZGF0YSBmcmFtZSBhbmQgdGhlIFBDQSBtYXRyaXggZnJvbSB0aGUgb2JqZWN0LgoKYGBge3Igc2NwY2Egc2lsaG91ZXR0ZX0KIyBDYWxjdWxhdGUgc2lsaG91ZXR0ZSB3aWR0aApzY3BjYV9zaWxob3VldHRlX2RmIDwtIGNhbGN1bGF0ZV9zaWxob3VldHRlKHBjYV9tYXRyaXgsIHNjcGNhX2NsdXN0ZXJfZGYpCnNjcGNhX3NpbGhvdWV0dGVfZGYKYGBgCgpgYGB7ciBzY3BjYSBwdXJpdHl9CiMgQ2FsY3VsYXRlIG5laWdoYm9yaG9vZCBwdXJpdHkKc2NwY2FfcHVyaXR5X2RmIDwtIGNhbGN1bGF0ZV9wdXJpdHkocGNhX21hdHJpeCwgc2NwY2FfY2x1c3Rlcl9kZikKc2NwY2FfcHVyaXR5X2RmCmBgYAoKV2hlbiBydW5uaW5nIGBjYWxjdWxhdGVfc3RhYmlsaXR5KClgLCB3ZSdsbCBzcGVjaWZ5IHRoZSBzYW1lIHBhcmFtZXRlcnMgb3JpZ2luYWxseSB1c2VkIHRvIGJ1aWxkIHRoZSBjbHVzdGVycy4KV2Ugb25seSByZWNvbW1lbmQgZXZhbHVhdGluZyBjbHVzdGVycyB3aXRoIGBjYWxjdWxhdGVfc3RhYmlsaXR5KClgIGlmIHlvdSBrbm93IHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXJzIHVzZWQuCgpgYGB7ciBzY3BjYSBzdGFiaWxpdHl9CnNjcGNhX3N0YWJpbGl0eV9kZiA8LSBjYWxjdWxhdGVfc3RhYmlsaXR5KAogIHBjYV9tYXRyaXgsCiAgc2NwY2FfY2x1c3Rlcl9kZiwKICAjIHByb3ZpZGUgU2NQQ0EgY2x1c3RlcmluZyBwYXJhbWV0ZXJzCiAgYWxnb3JpdGhtID0gImxvdXZhaW4iLAogIHdlaWdodGluZyA9ICJqYWNjYXJkIiwKICBubiA9IDIwCikKc2NwY2Ffc3RhYmlsaXR5X2RmCmBgYAoKCgojIyBXb3JraW5nIHdpdGggb2JqZWN0cyBkaXJlY3RseQoKQXMgcHJlc2VudGVkIGFib3ZlLCBgck9wZW5TY1BDQWAgY2x1c3RlcmluZyBmdW5jdGlvbnMgdGFrZSBhIFBDQSBtYXRyaXggd2l0aCByb3cgbmFtZXMgcmVwcmVzZW50aW5nIHVuaXF1ZSBjZWxsIGlkcyBhcyB0aGVpciBmaXJzdCBhcmd1bWVudC4KCkluc3RlYWQgb2YgYSBtYXRyaXgsIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBwYXNzIGluIGFuIFNDRSBvciBTZXVyYXQgb2JqZWN0IHRoYXQgY29udGFpbnMgYSBtYXRyaXguCldlIHNob3cgZXhhbXBsZXMgb2YgdGhpcyBiZWxvdyB3aXRoIGByT3BlblNjUENBOjpjYWxjdWxhdGVfY2x1c3RlcnMoKWAsIGJ1dCB0aGlzIHdpbGwgYWxzbyB3b3JrIGZvciBhbnkgb2YgdGhlIGV2YWx1YXRpb24gZnVuY3Rpb25zIGFzIHdlbGw6CgpgYGB7ciBydW4gb24gc2NlfQojIENhbGN1bGF0ZSBjbHVzdGVycyBmcm9tIGFuIFNDRSBvYmplY3QgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzCmNsdXN0ZXJfcmVzdWx0c19kZiA8LSBjYWxjdWxhdGVfY2x1c3RlcnMoc2NlKQpjbHVzdGVyX3Jlc3VsdHNfZGYKYGBgCgoKYGBge3IgcnVuIG9uIHNldXJhdH0KIyBDYWxjdWxhdGUgY2x1c3RlcnMgZnJvbSBhIFNldXJhdCBvYmplY3QgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzCmNsdXN0ZXJfcmVzdWx0c19kZiA8LSBjYWxjdWxhdGVfY2x1c3RlcnMoc2V1cmF0X29iaikKY2x1c3Rlcl9yZXN1bHRzX2RmCmBgYAoKCmByT3BlblNjUENBYCBhc3N1bWVzIHRoYXQgdGhlIFBDQSBtYXRyaXggaXMgbmFtZWQgYFBDQWAgaW4gU0NFIG9iamVjdHMsIGFuZCBgcGNhYCBpbiBTZXVyYXQgb2JqZWN0cyAoYXMgdGhleSB3ZXJlIGluIHRoZSBhYm92ZSBleGFtcGxlcykuCklmIHRoZSBQQ0EgbWF0cml4IHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgb2JqZWN0IGhhcyBhIGRpZmZlcmVudCBuYW1lLCB5b3UgY2FuIHByb3ZpZGUgdGhlIGFyZ3VtZW50IGBwY19uYW1lYC4KV2UgY2FuIHNlZSB0aGlzIGJlbG93IHdpdGggYW4gU0NFIG9iamVjdCwgZm9yIGV4YW1wbGU6CgpgYGB7ciB1c2UgcGNfbmFtZX0KIyBGaXJzdCwgd2UnbGwgcmVuYW1lIHRoZSBQQ0EgbWF0cml4IGZvciBkZW1vbnN0cmF0aW9uCnJlZHVjZWREaW1OYW1lcyhzY2UpIDwtIGMoIlBDQV9tYXRyaXgiLCAiVU1BUCIpCnJlZHVjZWREaW1OYW1lcyhzY2UpCgojIENhbGN1bGF0ZSBjbHVzdGVycyBmcm9tIGFuIFNDRSBvYmplY3QgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzCmNsdXN0ZXJfcmVzdWx0c19kZiA8LSBjYWxjdWxhdGVfY2x1c3RlcnMoCiAgc2NlLAogIHBjX25hbWUgPSAiUENBX21hdHJpeCIKKQpjbHVzdGVyX3Jlc3VsdHNfZGYKYGBgCgoKCiMjIFNhdmluZyBjbHVzdGVyaW5nIHJlc3VsdHMgCgpSZXN1bHRzIGNhbiBlaXRoZXIgYmUgZGlyZWN0bHkgZXhwb3J0ZWQgYXMgYSBUU1YgZmlsZSAoZS5nLiwgd2l0aCBgcmVhZHI6OndyaXRlX3RzdigpYCksIG9yIHlvdSBjYW4gYWRkIHRoZSByZXN1bHRzIGludG8geW91ciBTQ0Ugb3IgU2V1cmF0IG9iamVjdC4KVGhlIHN1YnNlcXVlbnQgZXhhbXBsZXMgd2lsbCBzaG93IHlvdSBob3cgdG8gc2F2ZSB0aGUgYGNsdXN0ZXJfcmVzdWx0c19kZmAgZGF0YSBmcmFtZSB0byBhbiBTQ0UgYW5kIGEgU2V1cmF0IG9iamVjdC4KCl9BIHdvcmQgb2YgY2F1dGlvbiFfCk9iamVjdHMgZnJvbSB0aGUgU2NQQ0EgUG9ydGFsIGFscmVhZHkgY29udGFpbiBhIGNvbHVtbiBjYWxsZWQgYGNsdXN0ZXJgIHdpdGggcmVzdWx0cyBmcm9tIGFuIGF1dG9tYXRlZCBjbHVzdGVyaW5nLgpUaGVzZSBhdXRvbWF0aWMgY2x1c3RlcnMgd2VyZSBub3QgZXZhbHVhdGVkLCBhbmQgdGhlaXIgcGFyYW1ldGVycyB3ZXJlIG5vdCBvcHRpbWl6ZWQgZm9yIGFueSBnaXZlbiBsaWJyYXJ5LgoKVG8gYXZvaWQgYW1iaWd1aXR5IGJldHdlZW4gdGhlIGV4aXN0aW5nIGFuZCBuZXcgY2x1c3RlcmluZyByZXN1bHRzLCB5b3UgbWF5IHdhbnQgdG8gcmVuYW1lIGluY29taW5nIGNvbHVtbnMuCgpXZSdsbCB0aGVyZWZvcmUgYmVnaW4gYnkgYWRkaW5nIHRoZSBwcmVmaXggYHJvcGVuc2NwY2FfYCB0byBhbGwgY29sdW1uIG5hbWVzIGluIHRoZSBgY2x1c3Rlcl9yZXN1bHRzX2RmYCBkYXRhIGZyYW1lIGJlZm9yZSBhZGRpbmcgdGhlbSB0byBhIGdpdmVuIG9iamVjdC4KCmBgYHtyIHJlbmFtZSBjb2x1bW5zfQojIEZpcnN0LCByZW5hbWUgY29sdW1ucyBpbiBgY2x1c3Rlcl9yZXN1bHRzX2RmYCB0byBhdm9pZCBhbWJpZ3VpdHkKY2x1c3Rlcl9yZXN1bHRzX3JlbmFtZWRfZGYgPC0gY2x1c3Rlcl9yZXN1bHRzX2RmIHw+CiAgIyBhZGQgdGhlIHByZWZpeCBvcGVuc2NwY2FfIHRvIGFsbCBjb2x1bW5zCiAgZHBseXI6OnJlbmFtZV93aXRoKH4gcGFzdGUwKCJyb3BlbnNjcGNhXyIsIC54KSkKCmNsdXN0ZXJfcmVzdWx0c19yZW5hbWVkX2RmCmBgYAoKCiMjIyBTYXZpbmcgcmVzdWx0cyB0byBhbiBTQ0Ugb2JqZWN0IAoKRm9sbG93IHRoZXNlIHN0ZXBzIHRvIHNhdmUgdGhlIGNsdXN0ZXJpbmcgcmVzdWx0cyB0byBhbiBTQ0Ugb2JqZWN0J3MgYGNvbERhdGFgOgoKYGBge3IgYWRkIHRvIHNjZX0KIyBGaXJzdCwgZXh0cmFjdCB0aGUgY29sRGF0YSBpbnRvIGEgc2VwYXJhdGUgZGF0YSBmcmFtZSBmb3IgbWFuaXB1bGF0aW9uCnNjZV9jb2xkYXRhIDwtIGNvbERhdGEoc2NlKSB8PgogIGFzLmRhdGEuZnJhbWUoKQoKIyBTZWNvbmQsIGFkZCBjb2x1bW5zIGFzIGRlc2lyZWQgdXNpbmcgdGhlIGJhcmNvZGVzIGFuZCBjZWxsX2lkIGNvbHVtbnMgdG8gam9pbgpzY2VfY29sZGF0YSA8LSBzY2VfY29sZGF0YSB8PgogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICBjbHVzdGVyX3Jlc3VsdHNfcmVuYW1lZF9kZiwKICAgIGJ5ID0gYygiYmFyY29kZXMiID0gInJvcGVuc2NwY2FfY2VsbF9pZCIpCiAgKQoKIyBUaGlyZCwgYWRkIHRoZSBtb2RpZmllZCBjb2xEYXRhIGJhY2sgaW50byB0aGUgU0NFCiMgVXNlIHRoZSByb3cubmFtZXMgYXJndW1lbnQgdG8gZW5zdXJlIHJvd25hbWVzIChiYXJjb2RlcykgYXJlIHJldGFpbmVkOyBkb24ndCBmb3JnZXQgdGhpcyBzdGVwIQpjb2xEYXRhKHNjZSkgPC0gRGF0YUZyYW1lKAogIHNjZV9jb2xkYXRhLAogIHJvdy5uYW1lcyA9IHNjZV9jb2xkYXRhJGJhcmNvZGVzCikKCmNvbERhdGEoc2NlKQpgYGAKCiMjIyBTYXZpbmcgcmVzdWx0cyB0byBhIFNldXJhdCBvYmplY3QgCgpGb2xsb3cgdGhlc2Ugc3RlcHMgc2F2ZSB0aGUgY2x1c3RlcmluZyByZXN1bHRzIHRvIGEgU2V1cmF0IG9iamVjdCdzIGNlbGwgbWV0YWRhdGE6CgpgYGB7ciBhZGQgdG8gc2V1cmF0fQojIEFkZCB0aGUgY2x1c3RlciByZXN1bHQgZGF0YSBmcmFtZSB0byB0aGUgU2V1cmF0IG9iamVjdCBtZXRhZGF0YQpzZXVyYXRfb2JqIDwtIEFkZE1ldGFEYXRhKHNldXJhdF9vYmosIGNsdXN0ZXJfcmVzdWx0c19yZW5hbWVkX2RmKQoKIyBQcmludCB0aGUgY2VsbCBtZXRhZGF0YQpzZXVyYXRfb2JqQG1ldGEuZGF0YQpgYGAKCgojIyBTZXNzaW9uIEluZm8KCmBgYHtyIHNlc3Npb24gaW5mb30KIyByZWNvcmQgdGhlIHZlcnNpb25zIG9mIHRoZSBwYWNrYWdlcyB1c2VkIGluIHRoaXMgYW5hbHlzaXMgYW5kIG90aGVyIGVudmlyb25tZW50IGluZm9ybWF0aW9uCnNlc3Npb25JbmZvKCkKYGBgCg==
+LS0tCnRpdGxlOiAiUGVyZm9ybWluZyBncmFwaC1iYXNlZCBjbHVzdGVyaW5nIHdpdGggck9wZW5TY1BDQSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgphdXRob3I6ICJEYXRhIExhYiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyMgSW50cm9kdWN0aW9uCgpUaGlzIG5vdGVib29rIHByb3ZpZGVzIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgZnVuY3Rpb25zIGluIGByT3BlblNjUENBYCB0aGF0OgoKKiBQZXJmb3JtIGNsdXN0ZXJpbmcKKiBDYWxjdWxhdGUgUUMgbWV0cmljcyBvbiBjbHVzdGVycywgaW5jbHVkaW5nOgogICogU2lsaG91ZXR0ZSB3aWR0aAogICogTmVpZ2hib3Job29kIHB1cml0eQogICogQ2x1c3RlciBzdGFiaWxpdHksIGFzIG1lYXN1cmVkIHdpdGggdGhlIEFkanVzdGVkIFJhbmQgSW5kZXgKKiBDYWxjdWxhdGUgUUMgbWV0cmljcyBvbiBjbHVzdGVycyBvYnRhaW5lZCB3aXRoIG90aGVyIHRvb2xzLCBzdWNoIGFzIGBTZXVyYXRgCiogU2F2ZSBjbHVzdGVyaW5nIHJlc3VsdHMgdG8gYW4gU0NFIG9yIGBTZXVyYXRgCgpXaGlsZSB0aGlzIG5vdGVib29rIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIHRoYXQgY2FsY3VsYXRlIGhlbHBmdWwgbWV0cmljcyBmb3IgZXZhbHVhdGluZyBjbHVzdGVyaW5nIHJlc3VsdHMsIGEgZnVsbCBldmFsdWF0aW9uIHdvdWxkIGNvbXBhcmUgdGhlc2UgbWV0cmljcyBhY3Jvc3MgZGlmZmVyZW50IGNsdXN0ZXJpbmdzIGZyb20gZGlmZmVyZW50IHBhcmFtZXRlcml6YXRpb25zLgoKVGhpcyBub3RlYm9vayB3aWxsIHVzZSB0aGUgc2FtcGxlIGBTQ1BDUzAwMDAwMWAgZnJvbSBwcm9qZWN0IGBTQ1BDUDAwMDAwMWAsIHdoaWNoIGlzIGFzc3VtZWQgcHJlc2VudCBpbiB0aGUgYE9wZW5TY1BDQS1hbmFseXNpcy9kYXRhL2N1cnJlbnQvU0NQQ1AwMDAwMDFgIGRpcmVjdG9yeSwgZm9yIGFsbCBleGFtcGxlcy4KUGxlYXNlIFtzZWUgdGhpcyBkb2N1bWVudGF0aW9uXShodHRwczovL29wZW5zY3BjYS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2FjY2Vzc2luZy1yZXNvdXJjZXMvZ2V0dGluZy1hY2Nlc3MtdG8tZGF0YS8pIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9idGFpbmluZyBTY1BDQSBkYXRhLgoKIyMgU2V0dXAKCiMjIyBQYWNrYWdlcwoKCmBgYHtyIHBhY2thZ2VzfQpsaWJyYXJ5KHJPcGVuU2NQQ0EpCgpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCiAgbGlicmFyeShTZXVyYXQpCiAgbGlicmFyeShkcGx5cikKfSkKYGBgCgojIyMgU2V0IHRoZSByYW5kb20gc2VlZAoKQmVjYXVzZSBjbHVzdGVyaW5nIGludm9sdmVzIHJhbmRvbSBzYW1wbGluZywgaXQgaXMgaW1wb3J0YW50IHRvIHNldCB0aGUgcmFuZG9tIHNlZWQgYXQgdGhlIHRvcCBvZiB5b3VyIGFuYWx5c2lzIHNjcmlwdCBvciBub3RlYm9vayB0byBlbnN1cmUgcmVwcm9kdWNpYmlsdHkuCgpgYGB7ciBzZXQgc2VlZH0Kc2V0LnNlZWQoMjAyNCkKYGBgCgojIyMgUGF0aHMKCmBgYHtyIGJhc2UgcGF0aHN9CiMgVGhlIGJhc2UgcGF0aCBmb3IgdGhlIE9wZW5TY1BDQSByZXBvc2l0b3J5CnJlcG9zaXRvcnlfYmFzZSA8LSBycHJvanJvb3Q6OmZpbmRfcm9vdChycHJvanJvb3Q6OmlzX2dpdF9yb290KQoKIyBUaGUgY3VycmVudCBkYXRhIGRpcmVjdG9yeSwgZm91bmQgd2l0aGluIHRoZSByZXBvc2l0b3J5IGJhc2UgZGlyZWN0b3J5CmRhdGFfZGlyIDwtIGZpbGUucGF0aChyZXBvc2l0b3J5X2Jhc2UsICJkYXRhIiwgImN1cnJlbnQiKQoKIyBUaGUgcGF0aCB0byB0aGlzIG1vZHVsZQptb2R1bGVfYmFzZSA8LSBmaWxlLnBhdGgocmVwb3NpdG9yeV9iYXNlLCAiYW5hbHlzZXMiLCAiaGVsbG8tY2x1c3RlcnMiKQpgYGAKCiMjIyBJbnB1dCBmaWxlCgpgYGB7ciBwYXRoc30KIyBQYXRoIHRvIHByb2Nlc3NlZCBTQ0UgZmlsZSBmb3Igc2FtcGxlIFNDUENTMDAwMDAxCmlucHV0X3NjZV9maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwgIlNDUENQMDAwMDAxIiwgIlNDUENTMDAwMDAxIiwgIlNDUENMMDAwMDAxX3Byb2Nlc3NlZC5yZHMiKQpgYGAKCgojIyBSZWFkIGluIGFuZCBwcmVwYXJlIGRhdGEKClRvIGJlZ2luLCB3ZSdsbCByZWFkIGluIHRoZSBgU2luZ2xlQ2VsbEV4cGVyaW1lbnRgIChTQ0UpIG9iamVjdC4KV2UnbGwgYWxzbyBlc3RhYmxpc2ggYSBjb3JyZXNwb25kaW5nIHByb2Nlc3NlZCBTZXVyYXQgb2JqZWN0IGZyb20gaXRzIHJhdyBjb3VudHMgdGhhdCB3ZSdsbCB1c2UgZm9yIHNvbWUgZXhhbXBsZXMuCgpgYGB7ciByZWFkIGRhdGF9CiMgUmVhZCB0aGUgU0NFIGZpbGUKc2NlIDwtIHJlYWRSRFMoaW5wdXRfc2NlX2ZpbGUpCmBgYAoKYGBge3IgY3JlYXRlIHByb2Nlc3Mgc2V1cmF0LCBtZXNzYWdlID0gRkFMU0V9CiMgQ29udmVydCB0byBhIFNldXJhdCBvYmplY3QKc2V1cmF0X29iaiA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gY291bnRzKHNjZSksIGFzc2F5ID0gIlJOQSIpCgojIFByb2Nlc3MgdGhlIG9iamVjdCB3aXRoIGEgU2V1cmF0IHBpcGVsaW5lIHRvIG9idGFpbiBjbHVzdGVycwpzZXVyYXRfb2JqIDwtIHNldXJhdF9vYmogfD4KICBTQ1RyYW5zZm9ybSgpIHw+CiAgUnVuUENBKCkgfD4KICBGaW5kTmVpZ2hib3JzKCkgfD4KICBGaW5kQ2x1c3RlcnMoKQpgYGAKCgpXZSdsbCBhbHNvIGV4dHJhY3QgaXRzIFBDQSBtYXRyaXgsIHdoaWNoIHdlJ2xsIHVzZSB0byBkZW1vbnN0cmF0ZSBob3cgdG8gY2FsY3VsYXRlIGFuZCBldmFsdWF0ZSBjbHVzdGVycy4KV2UnbGwgc2hvdyBob3cgdG8gZG8gdGhpcyBmb3IgYm90aCBTQ0UgYW5kIFNldXJhdCBvYmplY3RzOgoKCmBgYHtyIGV4dHJhY3QgcGNhIGRhdGF9CiMgRXh0cmFjdCB0aGUgUENBIG1hdHJpeCBmcm9tIGFuIFNDRSBvYmplY3QKIyBNb3ZpbmcgZm9yd2FyZCwgd2UnbGwgdXNlIHRoaXMgdmVyc2lvbiBmb3IgbW9zdCBleGFtcGxlcwpwY2FfbWF0cml4IDwtIHJlZHVjZWREaW0oc2NlLCAiUENBIikKCgojIEV4dHJhY3QgdGhlIFBDQSBtYXRyaXggZnJvbSBhIFNldXJhdCBvYmplY3QKc2V1cmF0X3BjYV9tYXRyaXggPC0gRW1iZWRkaW5ncyhzZXVyYXRfb2JqLCByZWR1Y3Rpb24gPSAicGNhIikKYGBgCgojIyBQZXJmb3JtIGNsdXN0ZXJpbmcKClRoaXMgc2VjdGlvbiB3aWxsIHNob3cgaG93IHRvIHBlcmZvcm0gY2x1c3RlcmluZyB3aXRoIHRoZSBmdW5jdGlvbiBgck9wZW5TY1BDQTo6Y2FsY3VsYXRlX2NsdXN0ZXJzKClgLiAKClRoaXMgZnVuY3Rpb24gdGFrZXMgYSBQQ0EgbWF0cml4IHdpdGggcm93bmFtZXMgcmVwcmVzZW50aW5nIHVuaXF1ZSBjZWxsIGlkcyAoZS5nLiwgYmFyY29kZXMpIGFzIGl0cyBwcmltYXJ5IGFyZ3VtZW50LgpCeSBkZWZhdWx0IGl0IHdpbGwgY2FsY3VsYXRlIGNsdXN0ZXJzIHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKCiogTG91dmFpbiBhbGdvcml0aG0KKiBKYWNjYXJkIHdlaWdodGluZwoqIDEwIG5lYXJlc3QgbmVpZ2hib3JzCiogQSByZXNvbHV0aW9uIHBhcmFtZXRlciBvZiAxCgpUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdGFibGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbHVtbnM6CgoqIGBjZWxsX2lkYDogVW5pcXVlIGNlbGwgaWRlbnRpZmllcnMsIG9idGFpbmVkIGZyb20gdGhlIFBDQSBtYXRyaXgncyByb3cgbmFtZXMKKiBgY2x1c3RlcmA6IEEgZmFjdG9yIGNvbHVtbiB3aXRoIHRoZSBjbHVzdGVyIGlkZW50aXRpZXMKKiBUaGVyZSB3aWxsIGJlIG9uZSBjb2x1bW4gZm9yIGVhY2ggY2x1c3RlcmluZyBwYXJhbWV0ZXIgdXNlZAoKCiMjIyBDbHVzdGVyaW5nIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzCgpgYGB7ciBjbHVzdGVyIHNjZX0KIyBDYWxjdWxhdGUgY2x1c3RlcnMgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMKY2x1c3Rlcl9yZXN1bHRzX2RmIDwtIGNhbGN1bGF0ZV9jbHVzdGVycyhwY2FfbWF0cml4KQoKIyBQcmludCByZXN1bHRpbmcgdGFibGUKY2x1c3Rlcl9yZXN1bHRzX2RmCmBgYAoKIyMjIENsdXN0ZXJpbmcgd2l0aCBub24tZGVmYXVsdCBwYXJhbWV0ZXJzCgpQYXJhbWV0ZXJzIHVzZWQgZm9yIGNsdXN0ZXJpbmcgY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aCB0aGVzZSBhcmd1bWVudHM6CgoqIFRoZSBgYWxnb3JpdGhtYCBjYW4gYmUgb25lIG9mOgogICogYGxvdXZhaW5gLCBgd2Fsa3RyYXBgLCBvciBgbGVpZGVuYAoqIFRoZSBgd2VpZ2h0aW5nYCBjYW4gYmUgb25lIG9mOgogICogYGphY2NhcmRgLCBgcmFua2AsIG9yIGBudW1iZXJgCiogVGhlIG5lYXJlc3QgbmVpZ2hib3JzIHBhcmFtZXRlciBjYW4gYmUgY3VzdG9taXplZCB3aXRoIHRoZSBgbm5gIGFyZ3VtZW50CiogVGhlIHJlc29sdXRpb24gcGFyYW1ldGVyIGNhbiBiZSBjdXN0b21pemVkIHdpdGggdGhlIGByZXNvbHV0aW9uYCBhcmd1bWVudAogICogVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGJ5IExvdXZhaW4gYW5kIExlaWRlbiBhbGdvcml0aG1zCiogSWYgdGhlIExlaWRlbiBhbGdvcml0aG0gaXMgdXNlZCwgaXRzIGRlZmF1bHQgb2JqZWN0aXZlIGZ1bmN0aW9uIHBhcmFtZXRlciB3aWxsIGJlIGBDUE1gLCBidXQgeW91IGNhbiBhbHNvIHNldCAgYG9iamVjdGl2ZV9mdW5jdGlvbiA9ICJtb2R1bGFyaXR5ImAgaW5zdGVhZC4KKiBZb3UgY2FuIHByb3ZpZGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFzIGEgbGlzdCB0byB0aGUgYGNsdXN0ZXJfYXJnc2AgYXJndW1lbnQuCiAgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIFtgaWdyYXBoYCBkb2N1bWVudGF0aW9uXShodHRwczovL2lncmFwaC5vcmcvci9odG1sL2xhdGVzdCkgdG8gbGVhcm4gbW9yZSBhYm91dCB3aGF0IGFkZGl0aW9uYWwgcGFyYW1ldGVycyBjYW4gYmUgcHJvdmlkZWQgdG8gZWFjaCBjbHVzdGVyaW5nIGFsZ29yaXRobS4KICAqIE5vdGUgdGhhdCBgY2x1c3Rlcl9hcmdzYCBvbmx5IGFjY2VwdHMgc2luZ2xlLWxlbmd0aCBhcmd1bWVudHMgKG5vIHZlY3RvcnMgb3IgbGlzdHMpLgoKRm9yIGV4YW1wbGU6CgpgYGB7ciBjbHVzdGVyIHNjZSBub25kZWZhdWx0fQojIENhbGN1bGF0ZSBjbHVzdGVycyB3aXRoIG5vbi1kZWZhdWx0IHBhcmFtZXRlcnMKY2x1c3Rlcl9yZXN1bHRzX2RmIDwtIGNhbGN1bGF0ZV9jbHVzdGVycygKICBwY2FfbWF0cml4LAogIGFsZ29yaXRobSA9ICJsZWlkZW4iLAogIG5uID0gMTUsCiAgb2JqZWN0aXZlX2Z1bmN0aW9uID0gIm1vZHVsYXJpdHkiCikKCiMgUHJpbnQgcmVzdWx0aW5nIHRhYmxlCmNsdXN0ZXJfcmVzdWx0c19kZgpgYGAKCgojIyBDYWxjdWxhdGUgUUMgbWV0cmljcyBvbiBjbHVzdGVycwoKVGhpcyBzZWN0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIHNldmVyYWwgZnVuY3Rpb25zIGZvciBldmFsdWF0aW5nIGNsdXN0ZXIgcXVhbGl0eSBhbmQgcmVsaWFiaWxpdHkuIApJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgYSBmdWxsIGV2YWx1YXRpb24gb2YgY2x1c3RlcmluZyByZXN1bHRzIHdvdWxkIGNvbXBhcmUgdGhlc2UgbWV0cmljcyBhY3Jvc3MgYSBzZXQgb2YgY2x1c3RlcmluZyByZXN1bHRzLCB3aXRoIHRoZSBhaW0gb2YgaWRlbnRpZnlpbmcgYW4gb3B0aW1hbCBwYXJhbWV0ZXJpemF0aW9uLgoKQWxsIGZ1bmN0aW9ucyBwcmVzZW50ZWQgaW4gdGhpcyBzZWN0aW9uIHRha2UgdGhlIGZvbGxvd2luZyByZXF1aXJlZCBhcmd1bWVudHM6CgoqIEEgUENBIG1hdHJpeCB3aXRoIHJvdyBuYW1lcyByZXByZXNlbnRpbmcgdW5pcXVlIGNlbGwgaWRzIChlLmcuLCBiYXJjb2RlcykKKiBBIGRhdGEgZnJhbWUgd2l0aCwgYXQgbGVhc3QsIGNvbHVtbnMgcmVwcmVzZW50aW5nIHVuaXF1ZSBjZWxsIGlkcyBhbmQgY2x1c3RlciBhc3NpZ25tZW50cwogICogQnkgZGVmYXVsdCwgdGhlc2UgY29sdW1ucyBzaG91bGQgYmUgbmFtZWQgYGNlbGxfaWRgIGFuZCBgY2x1c3RlcmAsIHJlc3BlY3RpdmVseSwgbWF0Y2hpbmcgdGhlIG91dHB1dCBvZiBgck9wZW5TY1BDQTo6Y2FsY3VsYXRlX2NsdXN0ZXJzKClgCiAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzIHVzaW5nIHRoZSBhcmd1bWVudHMgYGNlbGxfaWRfY29sYCBhbmQgYGNsdXN0ZXJfY29sYAoKIyMjIFNpbGhvdWV0dGUgd2lkdGgKClNpbGhvdWV0dGUgd2lkdGggaXMgYSBjb21tb24gbWV0cmljIHRoYXQgbWVhc3VyZXMgaG93IHdlbGwgc2VwYXJhdGVkIGNsdXN0ZXJzIGFyZSBieSwgZm9yIGVhY2ggY2VsbCwgY29tcGFyaW5nIHRoZSBhdmVyYWdlIGRpc3RhbmNlIHRvIGFsbCBjZWxscyBpbiB0aGUgc2FtZSBjbHVzdGVyLCBhbmQgYWxsIGNlbGxzIGluIG90aGVyIGNsdXN0ZXJzLgpUaGlzIHZhbHVlIHJhbmdlcyBmcm9tIC0xIHRvIDEuCkNlbGxzIGluIHdlbGwtc2VwYXJhdGVkIGNsdXN0ZXJzIHNob3VsZCBoYXZlIGhpZ2ggc2lsaG91ZXR0ZSB2YWx1ZXMgY2xvc2VyIHRvIDEuCllvdSBjYW4gcmVhZCBtb3JlIGFib3V0IHNpbGhvdWV0dGUgd2lkdGggcHVyaXR5IGZyb20gdGhlIFtfT3JjaGVzdHJhdGluZyBTaW5nbGUgQ2VsbCBBbmFseXNpcyB3aXRoIEJpb2NvbmR1Y3Rvcl8gYm9va10oaHR0cHM6Ly9iaW9jb25kdWN0b3Iub3JnL2Jvb2tzLzMuMTkvT1NDQS5hZHZhbmNlZC9jbHVzdGVyaW5nLXJlZHV4Lmh0bWwjc2lsaG91ZXR0ZS13aWR0aCkuCgpXZSdsbCB1c2UgdGhlIGZ1bmN0aW9uIGByT3BlblNjUENBOjpjYWxjdWxhdGVfc2lsaG91ZXR0ZSgpYCB0byBjYWxjdWxhdGUgdGhlIHNpbGhvdWV0dGUgd2lkdGguCgpUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBpbnB1dHRlZCBkYXRhIGZyYW1lIHdpdGggdHdvIGFkZGl0aW9uYWwgY29sdW1uczoKCiogYHNpbGhvdWV0dGVfd2lkdGhgOiBUaGUgY2FsY3VsYXRlZCBzaWxob3VldHRlIHdpZHRoIGZvciB0aGUgY2VsbAoqIGBzaWxob3VldHRlX290aGVyYDogVGhlIGNsb3NldCBjbHVzdGVyIHRvIHRoZSBjZWxsIGJlc2lkZXMgdGhlIGNsdXN0ZXIgdG8gd2hpY2ggaXQgYmVsb25ncywgYXMgdXNlZCBpbiB0aGUgc2lsaG91ZXR0ZSB3aWR0aCBjYWxjdWxhdGlvbgoKCmBgYHtyIHNpbGhvdWV0dGV9CiMgY2FsY3VsYXRlIHRoZSBzaWxob3VldHRlIHdpZHRoIGZvciBlYWNoIGNlbGwKc2lsaG91ZXR0ZV9yZXN1bHRzIDwtIGNhbGN1bGF0ZV9zaWxob3VldHRlKAogIHBjYV9tYXRyaXgsCiAgY2x1c3Rlcl9yZXN1bHRzX2RmCikKCiMgcHJpbnQgcmVzdWx0CnNpbGhvdWV0dGVfcmVzdWx0cwpgYGAKCgojIyMgTmVpZ2hib3Job29kIHB1cml0eQoKTmVpZ2hib3Job29kIHB1cml0eSBpcyBkZWZpbmVkLCBmb3IgZWFjaCBjZWxsLCBhcyB0aGUgcHJvcG9ydGlvbiBvZiBuZWlnaGJvcmluZyBjZWxscyB0aGF0IGFyZSBhc3NpZ25lZCB0byB0aGUgc2FtZSBjbHVzdGVyLgpUaGlzIHZhbHVlIHJhbmdlcyBmcm9tIDAgdG8gMS4KQ2VsbHMgaW4gd2VsbC1zZXBhcmF0ZWQgY2x1c3RlcnMgc2hvdWxkIGhhdmUgaGlnaCBwdXJpdHkgdmFsdWVzIGNsb3NlciB0byAxLCBzaW5jZSB0aGVyZSBzaG91bGQgYmUgbWluaW1hbCBvdmVybGFwIGJldHdlZW4gbWVtYmVyIGFuZCBuZWlnaGJvcmluZyBjZWxscy4KWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgbmVpZ2hib3Job29kIHB1cml0eSBmcm9tIHRoZSBbX09yY2hlc3RyYXRpbmcgU2luZ2xlIENlbGwgQW5hbHlzaXMgd2l0aCBCaW9jb25kdWN0b3JfIGJvb2tdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy8zLjE5L09TQ0EuYWR2YW5jZWQvY2x1c3RlcmluZy1yZWR1eC5odG1sI2NsdXN0ZXItcHVyaXR5KS4KCldlJ2xsIHVzZSB0aGUgZnVuY3Rpb24gYHJPcGVuU2NQQ0E6OmNhbGN1bGF0ZV9wdXJpdHkoKWAgdG8gY2FsY3VsYXRlIHRoZSBuZWlnaGJvcmhvb2QgcHVyaXR5LgoKVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaW5wdXR0ZWQgZGF0YSBmcmFtZSB3aXRoIHR3byBhZGRpdGlvbmFsIGNvbHVtbnM6CgoqIGBwdXJpdHlgOiBUaGUgbmVpZ2hib3Job29kIHB1cml0eSBmb3IgdGhlIGNlbGwKKiBgbWF4aW11bV9uZWlnaGJvcmA6IFRoZSBjbHVzdGVyIHdpdGggdGhlIGhpZ2hlc3QgcHJvcG9ydGlvbiBvZiBvYnNlcnZhdGlvbnMgbmVpZ2hib3JpbmcgdGhlIGNlbGwKCgpgYGB7ciBwdXJpdHl9CiMgY2FsY3VsYXRlIHRoZSBuZWlnaGJvcmhvb2QgcHVyaXR5IGZvciBlYWNoIGNlbGwKcHVyaXR5X3Jlc3VsdHMgPC0gY2FsY3VsYXRlX3B1cml0eSgKICBwY2FfbWF0cml4LAogIGNsdXN0ZXJfcmVzdWx0c19kZgopCgojIHByaW50IHJlc3VsdApwdXJpdHlfcmVzdWx0cwpgYGAKCiMjIyBDbHVzdGVyIHN0YWJpbGl0eQoKQW5vdGhlciBhcHByb2FjaCB0byBleHBsb3JpbmcgY2x1c3RlciBxdWFsaXR5IGlzIGhvdyBzdGFibGUgdGhlIGNsdXN0ZXJzIHRoZW1zZWx2ZXMgYXJlIHVzaW5nIGJvb3RzdHJhcHBpbmcuIApHaXZlbiBhIHNldCBvZiBvcmlnaW5hbCBjbHVzdGVycywgd2UgY2FuIGNvbXBhcmUgdGhlIGJvb3RzdHJhcHBlZCBjbHVzdGVyIGlkZW50aXRpZXMgdG8gb3JpZ2luYWwgb25lcyB1c2luZyB0aGUgQWRqdXN0ZWQgUmFuZCBJbmRleCAoQVJJKSwgd2hpY2ggbWVhc3VyZXMgdGhlIHNpbWlsYXJpdHkgb2YgdHdvIGRhdGEgY2x1c3RlcmluZ3MuCkFSSSByYW5nZXMgZnJvbSAtMSB0byAxLCB3aGVyZToKCiogQSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGV5IGFyZSBjb21wbGV0ZWx5IG92ZXJsYXBwaW5nCiogQSB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMgdGhleSBhcmUgY29tcGxldGVseSBkaXN0aW5jdAoqIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgYSByYW5kb20gcmVsYXRpb25zaGlwCgpXZSBleHBlY3QgdGhhdCBoaWdobHkgc3RhYmxlIGNsdXN0ZXJpbmdzIGhhdmUgQVJJIHZhbHVlcyBjbG9zZXIgdG8gMSBhY3Jvc3MgYSBzZXQgb2YgYm9vdHN0cmFwIHJlcGxpY2F0ZXMuCgpZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCB0aGUgQWRqdXN0ZWQgUmFuZCBJbmRleCBmcm9tIHRoZSBbX09yY2hlc3RyYXRpbmcgU2luZ2xlIENlbGwgQW5hbHlzaXMgd2l0aCBCaW9jb25kdWN0b3JfIGJvb2tdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9ib29rcy9yZWxlYXNlL09TQ0EuYWR2YW5jZWQvY2x1c3RlcmluZy1yZWR1eC5odG1sI2FkanVzdGVkLXJhbmQtaW5kZXgpLgoKV2UnbGwgdXNlIHRoZSBmdW5jdGlvbiBgck9wZW5TY1BDQTo6Y2FsY3VsYXRlX3N0YWJpbGl0eSgpYCB0byBjYWxjdWxhdGUgdGhlIGNsdXN0ZXIgc3RhYmlsaXR5LgpCeSBkZWZhdWx0LCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDIwIGJvb3RzdHJhcCByZXBsaWNhdGVzLCBidXQgdGhpcyBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgYXJndW1lbnQgYHJlcGxpY2F0ZXNgLgoKVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIGRhdGEgZnJhbWUgd2l0aCBjb2x1bW5zIGByZXBsaWNhdGVgLCBgYXJpYCwgYW5kIGFkZGl0aW9uYWwgY29sdW1ucyBmb3IgdGhlIGNsdXN0ZXJpbmcgcGFyYW1ldGVycyB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgYm9vdHN0cmFwIGNsdXN0ZXJzLgoKYGBge3Igc3RhYmlsaXR5LCB3YXJuaW5nPUZBTFNFfQojIGNhbGN1bGF0ZSB0aGUgc3RhYmlsaXR5IG9mIGNsdXN0ZXJzCnN0YWJpbGl0eV9yZXN1bHRzIDwtIGNhbGN1bGF0ZV9zdGFiaWxpdHkoCiAgcGNhX21hdHJpeCwKICBjbHVzdGVyX3Jlc3VsdHNfZGYKKQoKIyBwcmludCB0aGUgcmVzdWx0CnN0YWJpbGl0eV9yZXN1bHRzCmBgYAoKIyMjIyBVc2luZyBub24tZGVmYXVsdCBjbHVzdGVyaW5nIHBhcmFtZXRlcnMKCldoZW4gY2FsY3VsYXRpbmcgYm9vdHN0cmFwIGNsdXN0ZXJzLCBgck9wZW5TY1BDQTo6Y2FsY3VsYXRlX3N0YWJpbGl0eSgpYCB1c2VzIGByT3BlblNjUENBOjpjYWxjdWxhdGVfY2x1c3RlcnMoKWAgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuIApJZiB5b3VyIG9yaWdpbmFsIGNsdXN0ZXJzIHdlcmUgbm90IGNhbGN1bGF0ZWQgd2l0aCB0aGVzZSBkZWZhdWx0cywgeW91IHNob3VsZCBwYXNzIHRob3NlIGN1c3RvbWl6ZWQgdmFsdWVzIGludG8gdGhpcyBmdW5jdGlvbiBhcyB3ZWxsIHRvIGVuc3VyZSBhIGZhaXIgY29tcGFyaXNvbiBiZXR3ZWVuIHlvdXIgb3JpZ2luYWwgY2x1c3RlcnMgYW5kIHRoZSBib290c3RyYXAgY2x1c3RlcnMuCgoKYGBge3Igc3RhYmlsaXR5IGN1c3RvbSBwYXJhbWV0ZXJzfQojIENhbGN1bGF0ZSBjbHVzdGVycyB3aXRoIG5vbi1kZWZhdWx0IHBhcmFtZXRlcnMKY2x1c3Rlcl9kZl9sZWlkZW4gPC0gY2FsY3VsYXRlX2NsdXN0ZXJzKAogIHBjYV9tYXRyaXgsCiAgYWxnb3JpdGhtID0gImxlaWRlbiIsCiAgcmVzb2x1dGlvbiA9IDAuNSwKICBubiA9IDE1CikKCiMgTm93LCBwYXNzIGluIHRoZSBzYW1lIGFyZ3VtZW50cyBjdXN0b21pemluZyBwYXJhbWV0ZXJzIGhlcmUKc3RhYmlsaXR5X3Jlc3VsdHNfbGVpZGVuIDwtIGNhbGN1bGF0ZV9zdGFiaWxpdHkoCiAgcGNhX21hdHJpeCwKICBjbHVzdGVyX2RmX2xlaWRlbiwKICBhbGdvcml0aG0gPSAibGVpZGVuIiwKICByZXNvbHV0aW9uID0gMC41LAogIG5uID0gMTUKKQoKc3RhYmlsaXR5X3Jlc3VsdHNfbGVpZGVuCmBgYAoKCgojIyAgQ2FsY3VsYXRlIFFDIG1ldHJpY3Mgb24gZXhpc3RpbmcgY2x1c3RlcnMKCkV2ZW4gaWYgeW91IHBlcmZvcm0gY2x1c3RlcmluZyB3aXRoIG90aGVyIHRvb2xzLCB5b3UgY2FuIHN0aWxsIHVzZSB0aGUgYHJPcGVuU2NQQ0FgIGZ1bmN0aW9ucyB0byBldmFsdWF0ZSB5b3VyIGNsdXN0ZXJzLgoKSW4gdGhpcyBzZWN0aW9uLCB3ZSdsbCBwcmVzZW50IGV4YW1wbGVzIG9mIGhvdyB5b3UgY2FuIGNhbGN1bGF0ZSB0aGUgc2lsaG91ZXR0ZSB3aWR0aCwgbmVpZ2hib3Job29kIHB1cml0eSwgYW5kIGNsdXN0ZXIgc3RhYmlsaXR5IGZyb20gZXhpc3RpbmcgY2x1c3RlciBhc3NpZ25tZW50cy4KCiMjIyBFdmFsdWF0aW5nIFNldXJhdCBjbHVzdGVycwoKSWYgeW91IGFyZSBhbmFseXppbmcgeW91ciBkYXRhIHdpdGggYSBTZXVyYXQgcGlwZWxpbmUgdGhhdCBpbmNsdWRlcyBjYWxjdWxhdGluZyBjbHVzdGVycywgeW91IGNhbiB1c2UgYHJPcGVuU2NQQ0FgIHRvIGV2YWx1YXRlIHRoZW0uCldlIHByZXZpb3VzbHkgY3JlYXRlZCBhIFNldXJhdCBvYmplY3QgY2FsbGVkIGBzZXVyYXRfb2JqYCB3aXRoIGNsdXN0ZXJzOgoKCmBgYHtyIHNob3cgc2V1cmF0IGNsdXN0ZXJzfQpoZWFkKHNldXJhdF9vYmokc2V1cmF0X2NsdXN0ZXJzKQpgYGAKClRvIGNhbGN1bGF0ZSBRQyBtZXRyaWNzIG9uIHRoZXNlIGNsdXN0ZXJzLCB3ZSdsbCBuZWVkIHR3byBwaWVjZXMgb2YgaW5mb3JtYXRpb246CgotIFRoZSBQQ0EgbWF0cml4Ci0gQSBkYXRhIGZyYW1lIHdpdGggY29sdW1ucyBgY2VsbF9pZGAgYW5kIGBjbHVzdGVyYAoKV2UnbGwgY3JlYXRlIHRob3NlIGhlcmU6CgpgYGB7ciBwcmVwYXJlIHNldXJhdCBpbnB1dH0KIyBFeHRyYWN0IHRoZSBQQ0EgbWF0cml4IGZyb20gdGhlIFNldXJhdCBvYmplY3QKc2V1cmF0X3BjYV9tYXRyaXggPC0gRW1iZWRkaW5ncyhzZXVyYXRfb2JqLCByZWR1Y3Rpb24gPSAicGNhIikKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSBmb3IgaW5wdXQKc2V1cmF0X2NsdXN0ZXJfZGYgPC0gZGF0YS5mcmFtZSgKICBjZWxsX2lkID0gbmFtZXMoc2V1cmF0X29iaiRzZXVyYXRfY2x1c3RlcnMpLAogIGNsdXN0ZXIgPSBzZXVyYXRfb2JqJHNldXJhdF9jbHVzdGVycwopCmBgYAoKTm93LCB3ZSBjYW4gcnVuIGBjYWxjdWxhdGVfc2lsaG91ZXR0ZSgpYCBhbmQgYGNhbGN1bGF0ZV9wdXJpdHkoKWA6CgpgYGB7ciBzZXVyYXQgc2lsaG91ZXR0ZX0Kc2V1cmF0X3NpbGhvdWV0dGVfZGYgPC0gY2FsY3VsYXRlX3NpbGhvdWV0dGUoCiAgc2V1cmF0X3BjYV9tYXRyaXgsCiAgc2V1cmF0X2NsdXN0ZXJfZGYKKQpzZXVyYXRfc2lsaG91ZXR0ZV9kZgpgYGAKCmBgYHtyIHNldXJhdCBwdXJpdHl9CnNldXJhdF9wdXJpdHlfZGYgPC0gY2FsY3VsYXRlX3B1cml0eSgKICBzZXVyYXRfcGNhX21hdHJpeCwKICBzZXVyYXRfY2x1c3Rlcl9kZgopCnNldXJhdF9wdXJpdHlfZGYKYGBgCgpXZSBkbyBub3QgcmVjb21tZW5kIHVzaW5nIGByT3BlblNjUENBOjpjYWxjdWxhdGVfc3RhYmlsaXR5KClgIG9uIFNldXJhdCBjbHVzdGVycyBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gdGhlIHVuZGVybHlpbmcgY2x1c3RlcmluZyBhcHByb2FjaCBiZXR3ZWVuIFNldXJhdCBhbmQgdGhlIGBibHVzdGVyYCBwYWNrYWdlIHdoaWNoIGByT3BlblNjUENBYCB1c2VzLgoKIyMjIEV2YWx1YXRpbmcgU2NQQ0EgY2x1c3RlcnMKClNjUENBIGNlbGwgbWV0YWRhdGEgYWxyZWFkeSBjb250YWlucyBhIGNvbHVtbiBjYWxsZWQgYGNsdXN0ZXJgIHdpdGggcmVzdWx0cyBmcm9tIGFuIGF1dG9tYXRlZCBjbHVzdGVyaW5nLiAKVGhlc2UgY2x1c3RlcnMgd2VyZSBjYWxjdWxhdGVkIHVzaW5nIGBibHVzdGVyYCwgdGhlIHNhbWUgdG9vbCB0aGF0IGByT3BlblNjUENBYCB1c2VzLCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKCiogVGhlIExvdXZhaW4gYWxnb3JpdGhtCiogSmFjY2FyZCB3ZWlnaHRpbmcKKiAyMCBuZWFyZXN0IG5laWdoYm9ycwoKSW4gdGhpcyBleGFtcGxlLCB3ZSdsbCBzaG93IGhvdyB0byB1c2UgdGhlIGNsdXN0ZXIgZXZhbHVhdGlvbiBmdW5jdGlvbnMgb24gdGhlc2UgY2x1c3RlcnMuCgpUbyBiZWdpbiwgd2UnbGwgcHJlcGFyZSBhIGRhdGEgZnJhbWUgd2l0aCB0d28gY29sdW1uczogYGNlbGxfaWRgIGNvbnRhaW5pbmcgY2VsbCBiYXJjb2RlcywgYW5kIGBjbHVzdGVyYCBjb250YWluaW5nIHRoZSBjbHVzdGVyIGlkZW50aXRpZXMuCgpgYGB7ciBwcmVwYXJlIHNjcGNhIGRhdGEgZnJhbWV9CnNjcGNhX2NsdXN0ZXJfZGYgPC0gZGF0YS5mcmFtZSgKICBjZWxsX2lkID0gY29sbmFtZXMoc2NlKSwKICBjbHVzdGVyID0gY29sRGF0YShzY2UpJGNsdXN0ZXIKKQoKc2NwY2FfY2x1c3Rlcl9kZgpgYGAKCldlIGNhbiBydW4gZXZhbHVhdGlvbiBmdW5jdGlvbnMgdXNpbmcgdGhpcyBkYXRhIGZyYW1lIGFuZCB0aGUgUENBIG1hdHJpeCBmcm9tIHRoZSBvYmplY3QuCgpgYGB7ciBzY3BjYSBzaWxob3VldHRlfQojIENhbGN1bGF0ZSBzaWxob3VldHRlIHdpZHRoCnNjcGNhX3NpbGhvdWV0dGVfZGYgPC0gY2FsY3VsYXRlX3NpbGhvdWV0dGUocGNhX21hdHJpeCwgc2NwY2FfY2x1c3Rlcl9kZikKc2NwY2Ffc2lsaG91ZXR0ZV9kZgpgYGAKCmBgYHtyIHNjcGNhIHB1cml0eX0KIyBDYWxjdWxhdGUgbmVpZ2hib3Job29kIHB1cml0eQpzY3BjYV9wdXJpdHlfZGYgPC0gY2FsY3VsYXRlX3B1cml0eShwY2FfbWF0cml4LCBzY3BjYV9jbHVzdGVyX2RmKQpzY3BjYV9wdXJpdHlfZGYKYGBgCgpXaGVuIHJ1bm5pbmcgYGNhbGN1bGF0ZV9zdGFiaWxpdHkoKWAsIHdlJ2xsIHNwZWNpZnkgdGhlIHNhbWUgcGFyYW1ldGVycyBvcmlnaW5hbGx5IHVzZWQgdG8gYnVpbGQgdGhlIGNsdXN0ZXJzLgpXZSBvbmx5IHJlY29tbWVuZCBldmFsdWF0aW5nIGNsdXN0ZXJzIHdpdGggYGNhbGN1bGF0ZV9zdGFiaWxpdHkoKWAgaWYgeW91IGtub3cgdGhlIG9yaWdpbmFsIHBhcmFtZXRlcnMgdXNlZC4KCmBgYHtyIHNjcGNhIHN0YWJpbGl0eX0Kc2NwY2Ffc3RhYmlsaXR5X2RmIDwtIGNhbGN1bGF0ZV9zdGFiaWxpdHkoCiAgcGNhX21hdHJpeCwKICBzY3BjYV9jbHVzdGVyX2RmLAogICMgcHJvdmlkZSBTY1BDQSBjbHVzdGVyaW5nIHBhcmFtZXRlcnMKICBhbGdvcml0aG0gPSAibG91dmFpbiIsCiAgd2VpZ2h0aW5nID0gImphY2NhcmQiLAogIG5uID0gMjAKKQpzY3BjYV9zdGFiaWxpdHlfZGYKYGBgCgoKCiMjIFdvcmtpbmcgd2l0aCBvYmplY3RzIGRpcmVjdGx5CgpBcyBwcmVzZW50ZWQgYWJvdmUsIGByT3BlblNjUENBYCBjbHVzdGVyaW5nIGZ1bmN0aW9ucyB0YWtlIGEgUENBIG1hdHJpeCB3aXRoIHJvdyBuYW1lcyByZXByZXNlbnRpbmcgdW5pcXVlIGNlbGwgaWRzIGFzIHRoZWlyIGZpcnN0IGFyZ3VtZW50LgoKSW5zdGVhZCBvZiBhIG1hdHJpeCwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHBhc3MgaW4gYW4gU0NFIG9yIFNldXJhdCBvYmplY3QgdGhhdCBjb250YWlucyBhIG1hdHJpeC4KV2Ugc2hvdyBleGFtcGxlcyBvZiB0aGlzIGJlbG93IHdpdGggYHJPcGVuU2NQQ0E6OmNhbGN1bGF0ZV9jbHVzdGVycygpYCwgYnV0IHRoaXMgd2lsbCBhbHNvIHdvcmsgZm9yIGFueSBvZiB0aGUgZXZhbHVhdGlvbiBmdW5jdGlvbnMgYXMgd2VsbDoKCmBgYHtyIHJ1biBvbiBzY2V9CiMgQ2FsY3VsYXRlIGNsdXN0ZXJzIGZyb20gYW4gU0NFIG9iamVjdCB1c2luZyBkZWZhdWx0IHBhcmFtZXRlcnMKY2x1c3Rlcl9yZXN1bHRzX2RmIDwtIGNhbGN1bGF0ZV9jbHVzdGVycyhzY2UpCmNsdXN0ZXJfcmVzdWx0c19kZgpgYGAKCgpgYGB7ciBydW4gb24gc2V1cmF0fQojIENhbGN1bGF0ZSBjbHVzdGVycyBmcm9tIGEgU2V1cmF0IG9iamVjdCB1c2luZyBkZWZhdWx0IHBhcmFtZXRlcnMKY2x1c3Rlcl9yZXN1bHRzX2RmIDwtIGNhbGN1bGF0ZV9jbHVzdGVycyhzZXVyYXRfb2JqKQpjbHVzdGVyX3Jlc3VsdHNfZGYKYGBgCgoKYHJPcGVuU2NQQ0FgIGFzc3VtZXMgdGhhdCB0aGUgUENBIG1hdHJpeCBpcyBuYW1lZCBgUENBYCBpbiBTQ0Ugb2JqZWN0cywgYW5kIGBwY2FgIGluIFNldXJhdCBvYmplY3RzIChhcyB0aGV5IHdlcmUgaW4gdGhlIGFib3ZlIGV4YW1wbGVzKS4KSWYgdGhlIFBDQSBtYXRyaXggeW91IHdhbnQgdG8gdXNlIGluIHRoZSBvYmplY3QgaGFzIGEgZGlmZmVyZW50IG5hbWUsIHlvdSBjYW4gcHJvdmlkZSB0aGUgYXJndW1lbnQgYHBjX25hbWVgLgpXZSBjYW4gc2VlIHRoaXMgYmVsb3cgd2l0aCBhbiBTQ0Ugb2JqZWN0LCBmb3IgZXhhbXBsZToKCmBgYHtyIHVzZSBwY19uYW1lfQojIEZpcnN0LCB3ZSdsbCByZW5hbWUgdGhlIFBDQSBtYXRyaXggZm9yIGRlbW9uc3RyYXRpb24KcmVkdWNlZERpbU5hbWVzKHNjZSkgPC0gYygiUENBX21hdHJpeCIsICJVTUFQIikKcmVkdWNlZERpbU5hbWVzKHNjZSkKCiMgQ2FsY3VsYXRlIGNsdXN0ZXJzIGZyb20gYW4gU0NFIG9iamVjdCB1c2luZyBkZWZhdWx0IHBhcmFtZXRlcnMKY2x1c3Rlcl9yZXN1bHRzX2RmIDwtIGNhbGN1bGF0ZV9jbHVzdGVycygKICBzY2UsCiAgcGNfbmFtZSA9ICJQQ0FfbWF0cml4IgopCmNsdXN0ZXJfcmVzdWx0c19kZgpgYGAKCgoKIyMgU2F2aW5nIGNsdXN0ZXJpbmcgcmVzdWx0cyAKClJlc3VsdHMgY2FuIGVpdGhlciBiZSBkaXJlY3RseSBleHBvcnRlZCBhcyBhIFRTViBmaWxlIChlLmcuLCB3aXRoIGByZWFkcjo6d3JpdGVfdHN2KClgKSwgb3IgeW91IGNhbiBhZGQgdGhlIHJlc3VsdHMgaW50byB5b3VyIFNDRSBvciBTZXVyYXQgb2JqZWN0LgpUaGUgc3Vic2VxdWVudCBleGFtcGxlcyB3aWxsIHNob3cgeW91IGhvdyB0byBzYXZlIHRoZSBgY2x1c3Rlcl9yZXN1bHRzX2RmYCBkYXRhIGZyYW1lIHRvIGFuIFNDRSBhbmQgYSBTZXVyYXQgb2JqZWN0LgoKX0Egd29yZCBvZiBjYXV0aW9uIV8KT2JqZWN0cyBmcm9tIHRoZSBTY1BDQSBQb3J0YWwgYWxyZWFkeSBjb250YWluIGEgY29sdW1uIGNhbGxlZCBgY2x1c3RlcmAgd2l0aCByZXN1bHRzIGZyb20gYW4gYXV0b21hdGVkIGNsdXN0ZXJpbmcuClRoZXNlIGF1dG9tYXRpYyBjbHVzdGVycyB3ZXJlIG5vdCBldmFsdWF0ZWQsIGFuZCB0aGVpciBwYXJhbWV0ZXJzIHdlcmUgbm90IG9wdGltaXplZCBmb3IgYW55IGdpdmVuIGxpYnJhcnkuCgpUbyBhdm9pZCBhbWJpZ3VpdHkgYmV0d2VlbiB0aGUgZXhpc3RpbmcgYW5kIG5ldyBjbHVzdGVyaW5nIHJlc3VsdHMsIHlvdSBtYXkgd2FudCB0byByZW5hbWUgaW5jb21pbmcgY29sdW1ucy4KCldlJ2xsIHRoZXJlZm9yZSBiZWdpbiBieSBhZGRpbmcgdGhlIHByZWZpeCBgcm9wZW5zY3BjYV9gIHRvIGFsbCBjb2x1bW4gbmFtZXMgaW4gdGhlIGBjbHVzdGVyX3Jlc3VsdHNfZGZgIGRhdGEgZnJhbWUgYmVmb3JlIGFkZGluZyB0aGVtIHRvIGEgZ2l2ZW4gb2JqZWN0LgoKYGBge3IgcmVuYW1lIGNvbHVtbnN9CiMgRmlyc3QsIHJlbmFtZSBjb2x1bW5zIGluIGBjbHVzdGVyX3Jlc3VsdHNfZGZgIHRvIGF2b2lkIGFtYmlndWl0eQpjbHVzdGVyX3Jlc3VsdHNfcmVuYW1lZF9kZiA8LSBjbHVzdGVyX3Jlc3VsdHNfZGYgfD4KICAjIGFkZCB0aGUgcHJlZml4IG9wZW5zY3BjYV8gdG8gYWxsIGNvbHVtbnMKICBkcGx5cjo6cmVuYW1lX3dpdGgofiBwYXN0ZTAoInJvcGVuc2NwY2FfIiwgLngpKQoKY2x1c3Rlcl9yZXN1bHRzX3JlbmFtZWRfZGYKYGBgCgoKIyMjIFNhdmluZyByZXN1bHRzIHRvIGFuIFNDRSBvYmplY3QgCgpGb2xsb3cgdGhlc2Ugc3RlcHMgdG8gc2F2ZSB0aGUgY2x1c3RlcmluZyByZXN1bHRzIHRvIGFuIFNDRSBvYmplY3QncyBgY29sRGF0YWA6CgpgYGB7ciBhZGQgdG8gc2NlfQojIEZpcnN0LCBleHRyYWN0IHRoZSBjb2xEYXRhIGludG8gYSBzZXBhcmF0ZSBkYXRhIGZyYW1lIGZvciBtYW5pcHVsYXRpb24Kc2NlX2NvbGRhdGEgPC0gY29sRGF0YShzY2UpIHw+CiAgYXMuZGF0YS5mcmFtZSgpCgojIFNlY29uZCwgYWRkIGNvbHVtbnMgYXMgZGVzaXJlZCB1c2luZyB0aGUgYmFyY29kZXMgYW5kIGNlbGxfaWQgY29sdW1ucyB0byBqb2luCnNjZV9jb2xkYXRhIDwtIHNjZV9jb2xkYXRhIHw+CiAgZHBseXI6OmxlZnRfam9pbigKICAgIGNsdXN0ZXJfcmVzdWx0c19yZW5hbWVkX2RmLAogICAgYnkgPSBjKCJiYXJjb2RlcyIgPSAicm9wZW5zY3BjYV9jZWxsX2lkIikKICApCgojIFRoaXJkLCBhZGQgdGhlIG1vZGlmaWVkIGNvbERhdGEgYmFjayBpbnRvIHRoZSBTQ0UKIyBVc2UgdGhlIHJvdy5uYW1lcyBhcmd1bWVudCB0byBlbnN1cmUgcm93bmFtZXMgKGJhcmNvZGVzKSBhcmUgcmV0YWluZWQ7IGRvbid0IGZvcmdldCB0aGlzIHN0ZXAhCmNvbERhdGEoc2NlKSA8LSBEYXRhRnJhbWUoCiAgc2NlX2NvbGRhdGEsCiAgcm93Lm5hbWVzID0gc2NlX2NvbGRhdGEkYmFyY29kZXMKKQoKY29sRGF0YShzY2UpCmBgYAoKIyMjIFNhdmluZyByZXN1bHRzIHRvIGEgU2V1cmF0IG9iamVjdCAKCkZvbGxvdyB0aGVzZSBzdGVwcyBzYXZlIHRoZSBjbHVzdGVyaW5nIHJlc3VsdHMgdG8gYSBTZXVyYXQgb2JqZWN0J3MgY2VsbCBtZXRhZGF0YToKCmBgYHtyIGFkZCB0byBzZXVyYXR9CiMgQWRkIHRoZSBjbHVzdGVyIHJlc3VsdCBkYXRhIGZyYW1lIHRvIHRoZSBTZXVyYXQgb2JqZWN0IG1ldGFkYXRhCnNldXJhdF9vYmogPC0gQWRkTWV0YURhdGEoc2V1cmF0X29iaiwgY2x1c3Rlcl9yZXN1bHRzX3JlbmFtZWRfZGYpCgojIFByaW50IHRoZSBjZWxsIG1ldGFkYXRhCnNldXJhdF9vYmpAbWV0YS5kYXRhCmBgYAoKCiMjIFNlc3Npb24gSW5mbwoKYGBge3Igc2Vzc2lvbiBpbmZvfQojIHJlY29yZCB0aGUgdmVyc2lvbnMgb2YgdGhlIHBhY2thZ2VzIHVzZWQgaW4gdGhpcyBhbmFseXNpcyBhbmQgb3RoZXIgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24Kc2Vzc2lvbkluZm8oKQpgYGAK