From e33cdb52b6ad4f4eb52978c1de5f76ea32c21a43 Mon Sep 17 00:00:00 2001 From: Candace Savonen Date: Tue, 5 Jan 2021 09:40:19 -0500 Subject: [PATCH] Revert "Merge branch 'master' into v18-ci" This reverts commit 27dec43f1d030e2ebdcddc5d6a4dcb79bdfaac0f. --- .circleci/config.yml | 60 +- Dockerfile | 2 +- .../03-subgrouping_samples.html | 308 +- ...ession-rsem-fpkm-collapsed.stranded.tsv.gz | Bin 5283760 -> 5234912 bytes .../results/EPN_all_data.tsv | 187 +- .../results/EPN_all_data_withsubgroup.tsv | 187 +- .../01-compile-subtyping-results.nb.html | 2922 +----------- .../02-incorporate-clinical-feedback.Rmd | 30 +- .../02-incorporate-clinical-feedback.nb.html | 2837 +----------- .../03-incorporate-pathology-feedback.Rmd | 251 -- .../03-incorporate-pathology-feedback.nb.html | 3986 +++-------------- ...ecular_subtypes_with_clinical_feedback.tsv | 2437 ++++------ ...types_with_clinical_pathology_feedback.tsv | 1816 +++----- 13 files changed, 2772 insertions(+), 12251 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 522d776f4c..26232e3b7a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -68,7 +68,7 @@ jobs: name: Molecular Subtyping Neurocytoma command: ./scripts/run_in_ci.sh bash analyses/molecular-subtyping-neurocytoma/run_subtyping.sh - # Commenting this out for now; the code is expected to change + # Commenting this out for now; the code is expected to change # - run: # name: Molecular Subtyping - Compile and incorporate pathology feedback # command: OPENPBTA_TESTING=1 ./scripts/run_in_ci.sh bash analyses/molecular-subtyping-pathology/run-subtyping-aggregation.sh @@ -132,17 +132,17 @@ jobs: name: Independent samples command: ./scripts/run_in_ci.sh bash analyses/independent-samples/run-independent-samples.sh -# - run: -# name: Interaction plot -# command: OPENPBTA_ALL=0 ./scripts/run_in_ci.sh bash analyses/interaction-plots/01-create-interaction-plots.sh + - run: + name: Interaction plot + command: OPENPBTA_ALL=0 ./scripts/run_in_ci.sh bash analyses/interaction-plots/01-create-interaction-plots.sh - run: - name: Mutational Signatures + name: Mutational Signatures command: OPENPBTA_QUICK_MUTSIGS=1 ./scripts/run_in_ci.sh bash analyses/mutational-signatures/run_mutational_signatures.sh -# - run: -# name: Chromosomal instability breakpoints -# command: OPENPBTA_TESTING=1 ./scripts/run_in_ci.sh bash analyses/chromosomal-instability/run_breakpoint_analysis.sh + - run: + name: Chromosomal instability breakpoints + command: OPENPBTA_TESTING=1 ./scripts/run_in_ci.sh bash analyses/chromosomal-instability/run_breakpoint_analysis.sh - run: name: Copy number consensus @@ -156,33 +156,33 @@ jobs: name: Survival analysis command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/survival-analysis/survival-analysis_template.Rmd', params = list(plot_ci = FALSE), clean = TRUE)" -# - run: -# name: Comparative RNASeq - generate correlation matrix - rsem-tpm.polya -# command: ./scripts/run_in_ci.sh python3 analyses/comparative-RNASeq-analysis/01-correlation-matrix.py ../../data/pbta-gene-expression-rsem-tpm.polya.rds --clinical-path ../../data/pbta-histologies.tsv --qc-manifest-path ../../data/pbta-mend-qc-manifest.tsv --qc-results-path ../../data/pbta-mend-qc-results.tar.gz --prefix rsem-tpm-polya- --verbose + - run: + name: Comparative RNASeq - generate correlation matrix - rsem-tpm.polya + command: ./scripts/run_in_ci.sh python3 analyses/comparative-RNASeq-analysis/01-correlation-matrix.py ../../data/pbta-gene-expression-rsem-tpm.polya.rds --clinical-path ../../data/pbta-histologies.tsv --qc-manifest-path ../../data/pbta-mend-qc-manifest.tsv --qc-results-path ../../data/pbta-mend-qc-results.tar.gz --prefix rsem-tpm-polya- --verbose -# - run: -# name: Comparative RNASeq - generate correlation matrix - rsem-tpm.stranded -# command: ./scripts/run_in_ci.sh python3 analyses/comparative-RNASeq-analysis/01-correlation-matrix.py ../../data/pbta-gene-expression-rsem-tpm.stranded.rds --clinical-path ../../data/pbta-histologies.tsv --qc-manifest-path ../../data/pbta-mend-qc-manifest.tsv --qc-results-path ../../data/pbta-mend-qc-results.tar.gz --prefix rsem-tpm-stranded- --verbose + - run: + name: Comparative RNASeq - generate correlation matrix - rsem-tpm.stranded + command: ./scripts/run_in_ci.sh python3 analyses/comparative-RNASeq-analysis/01-correlation-matrix.py ../../data/pbta-gene-expression-rsem-tpm.stranded.rds --clinical-path ../../data/pbta-histologies.tsv --qc-manifest-path ../../data/pbta-mend-qc-manifest.tsv --qc-results-path ../../data/pbta-mend-qc-results.tar.gz --prefix rsem-tpm-stranded- --verbose -# - run: -# name: Comparative RNASeq - generate thresholds and outliers - rsem-tpm.stranded -# command: ./scripts/run_in_ci.sh python3 analyses/comparative-RNASeq-analysis/02-thresholds-and-outliers.py --prefix rsem-tpm-stranded- --results results --verbose + - run: + name: Comparative RNASeq - generate thresholds and outliers - rsem-tpm.stranded + command: ./scripts/run_in_ci.sh python3 analyses/comparative-RNASeq-analysis/02-thresholds-and-outliers.py --prefix rsem-tpm-stranded- --results results --verbose - run: name: Process SV file command: ./scripts/run_in_ci.sh Rscript analyses/sv-analysis/01-process-sv-file.R -# - run: -# name: Oncoprint plotting -# command: ./scripts/run_in_ci.sh bash "analyses/oncoprint-landscape/run-oncoprint.sh" + - run: + name: Oncoprint plotting + command: ./scripts/run_in_ci.sh bash "analyses/oncoprint-landscape/run-oncoprint.sh" - run: name: GISTIC Plots command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/cnv-chrom-plot/gistic_plot.Rmd', clean = TRUE)" -# - run: -# name: CN Status Heatmap -# command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/cnv-chrom-plot/cn_status_heatmap.Rmd', clean = TRUE)" + - run: + name: CN Status Heatmap + command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/cnv-chrom-plot/cn_status_heatmap.Rmd', clean = TRUE)" - run: name: Gene set enrichment analysis to generate GSVA scores @@ -205,9 +205,9 @@ jobs: #### Add your analysis here #### ################################ -# - run: -# name: RNA-Seq composition -# command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/rna-seq-composition/rna-seq-composition.Rmd', clean = TRUE)" + - run: + name: RNA-Seq composition + command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/rna-seq-composition/rna-seq-composition.Rmd', clean = TRUE)" - run: name: TCGA SNV Caller Analysis @@ -224,7 +224,7 @@ jobs: - run: name: Exploration of nonsynonymous filter command: ./scripts/run_in_ci.sh bash analyses/snv-callers/explore_variant_classifications/run_explorations.sh - + # This analysis was used to explore the TCGA PBTA data when the BED files used to calculate TCGA # were incorrect https://github.com/AlexsLemonade/OpenPBTA-analysis/issues/568 #- run: @@ -254,9 +254,9 @@ jobs: name: TCGA Capture Kit Investigation command: ./scripts/run_in_ci.sh bash analyses/tcga-capture-kit-investigation/run-investigation.sh -# - run: -# name: d3b TMB code -# command: ./scripts/run_in_ci.sh bash analyses/tmb-compare/TMB_d3b_code/run_tmb_d3b.sh + - run: + name: d3b TMB code + command: ./scripts/run_in_ci.sh bash analyses/tmb-compare/TMB_d3b_code/run_tmb_d3b.sh - run: name: Compare TMB calculations diff --git a/Dockerfile b/Dockerfile index 05efc24e22..abf51a0f2a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -245,8 +245,8 @@ RUN pip3 install \ "cycler==0.10.0" "kiwisolver==1.1.0" "pyparsing==2.4.5" "python-dateutil==2.8.1" "pytz==2019.3" \ "cython==0.29.15" \ "ipykernel==4.8.1" \ + "jupyter==1.0.0" \ "matplotlib==3.0.3" \ - "notebook==6.0.0" \ "numpy==1.17.3" \ "pandas==0.25.3" \ "plotnine==0.3.0" \ diff --git a/analyses/molecular-subtyping-EPN/03-subgrouping_samples.html b/analyses/molecular-subtyping-EPN/03-subgrouping_samples.html index dfbb681285..7b8c15122c 100644 --- a/analyses/molecular-subtyping-EPN/03-subgrouping_samples.html +++ b/analyses/molecular-subtyping-EPN/03-subgrouping_samples.html @@ -12948,10 +12948,10 @@ ',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b - - - - - - - - - - - - - - - - - - ',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b - - - - - - - - - - - - - - - - - - ',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
-
-
-
- -
- - - - - +
@@ -3302,713 +674,305 @@

Pathology Feedback

ETMR Embryonal tumor -tumor -Updated via OpenPBTA subtyping -None documented -ETMR, C19MC-altered - - -BS_5P1TN10Z -hemispheric -7316-158 -746061 -PT_9BZETM0M -RNA-Seq -Supratentorial or Spinal Cord PNET -High-grade glioma -Path report PNET -reviewed - OK with new dx grade III-IV - -HGAT -Diffuse astrocytic and oligodendroglial tumor -tumor -from PNET to HGG due to H3F3A mutation;Updated via OpenPBTA subtyping -None documented -HGG, H3 G35 - - -BS_STNH7YSX -hemispheric -7316-158 -746056 -PT_9BZETM0M -WGS -Supratentorial or Spinal Cord PNET -High-grade glioma -Path report PNET -reviewed - OK with new dx grade III-IV - -HGAT -Diffuse astrocytic and oligodendroglial tumor -tumor -from PNET to HGG due to H3F3A mutation;Updated via OpenPBTA subtyping -None documented -HGG, H3 G35 - - -BS_TV5B86ZD -hemispheric -7316-158 -150593 -PT_9BZETM0M -RNA-Seq -Supratentorial or Spinal Cord PNET -High-grade glioma -Path report PNET -reviewed - OK with new dx grade III-IV - -HGAT -Diffuse astrocytic and oligodendroglial tumor -tumor -from PNET to HGG due to H3F3A mutation;Updated via OpenPBTA subtyping -None documented -HGG, H3 G35 - - - -

And the notes:

-
-

Few notes:

-
    -
  1. PT_7E3V3JFX specimens were consistent with the original EPN dx, so pathology would call this a rare EPN, H3 K28 mutated tumor, rather than DMG.
  2. -
  3. PT_AQWDQW27 specimen was consistent with meningioma, even though it has a hallmark EPN fusion, so pathology would also call this a rare meningioma with a YAP1 fusion.
  4. -
  5. Because 1 is a rare tumor (maybe first seen), the logic of searching for all H3 K28 mutations in HGG subtyping would convert this sample by default - how to handle this?
  6. -
  7. Pathology confirmed this HGG BRAF V600E mutant tumor, BS_H1XPVS9A, to be a LGAT (PXA). I updated molecular_subtype here based on what it would look like, but this should come through via the LGAT subtyping ticket. How should we add this info?
  8. -
-
-
-
-

Set up

- - - -
# This logic is the same as analyses/gene-set-enrichment-analysis/02-model-gsea.Rmd
-# Assigning params$is_ci to running_in_ci avoids a locked binding error
-running_in_ci <- params$is_ci
-
-# Are we testing? In case of a non 0/1 number, we recast as logical, and then 
-# ensure logical.
-if (running_in_ci %in% c(0,1)) running_in_ci <- as.logical(running_in_ci)
-if (!(is.logical(running_in_ci)))
-{
-  stop("\n\nERROR: The parameter `is_ci` should be FALSE/TRUE (or 0/1).")
-}
- - - - - - -
library(tidyverse)
- - - -
-

Directory and files

-
-

Directories

- - - -
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
-data_dir <- file.path(root_dir, "data")
-results_dir <- "results"
- - - -
-
-

Input

-

When we run this locally, we want to tie it to a specific version of the histologies file prior to feedback we received from pathology that is recorded on #609.

- - - -
if (running_in_ci) {
-  histologies_file <- file.path(data_dir, "pbta-histologies.tsv")
-} else {
-  histologies_file <- file.path(data_dir, "release-v15-20200228",
-                                "pbta-histologies.tsv")
-}
- - - - - - -
compiled_results_file <- file.path(results_dir, 
-                                   "compiled_molecular_subtypes_with_clinical_feedback.tsv")
-fusions_file <- file.path(data_dir,
-                          "pbta-fusion-putative-oncogenic.tsv")
- - - -
-
-

Output

- - - -
output_file <- file.path(results_dir,
-                         "compiled_molecular_subtypes_with_clinical_pathology_feedback.tsv")
- - - -
-
-
-
-

Read in data

- - - -
histologies_df <- read_tsv(histologies_file, guess_max = 10000)
-compiled_df <- read_tsv(compiled_results_file)
-fusions_df <- read_tsv(fusions_file)
- - - -
-
-

Revise subtyping calls based on pathology feedback

-
-

PT_7E3V3JFX

-

PT_7E3V3JFX was classified in molecular-subtyping-HGG as DMG, H3 K28 because the first step in that module was to identify any samples in the cohort with "defining lesions:" H3 K28 or H3 G35 (original subtyping issue: #249).

- - - -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_7E3V3JFX")
- - -
- -
- - - -

The relevant notes above are

+tumor +Updated via OpenPBTA subtyping +None documented +ETMR, C19MC-altered + + +BS_5P1TN10Z +hemispheric +7316-158 +746061 +PT_9BZETM0M +RNA-Seq +Supratentorial or Spinal Cord PNET +High-grade glioma +Path report PNET +reviewed - OK with new dx grade III-IV + +HGAT +Diffuse astrocytic and oligodendroglial tumor +tumor +from PNET to HGG due to H3F3A mutation;Updated via OpenPBTA subtyping +None documented +HGG, H3 G35 + + +BS_STNH7YSX +hemispheric +7316-158 +746056 +PT_9BZETM0M +WGS +Supratentorial or Spinal Cord PNET +High-grade glioma +Path report PNET +reviewed - OK with new dx grade III-IV + +HGAT +Diffuse astrocytic and oligodendroglial tumor +tumor +from PNET to HGG due to H3F3A mutation;Updated via OpenPBTA subtyping +None documented +HGG, H3 G35 + + +BS_TV5B86ZD +hemispheric +7316-158 +150593 +PT_9BZETM0M +RNA-Seq +Supratentorial or Spinal Cord PNET +High-grade glioma +Path report PNET +reviewed - OK with new dx grade III-IV + +HGAT +Diffuse astrocytic and oligodendroglial tumor +tumor +from PNET to HGG due to H3F3A mutation;Updated via OpenPBTA subtyping +None documented +HGG, H3 G35 + + + +

And the notes:

+

Few notes:

  1. PT_7E3V3JFX specimens were consistent with the original EPN dx, so pathology would call this a rare EPN, H3 K28 mutated tumor, rather than DMG.
  2. -
  3. Because 1 is a rare tumor (maybe first seen), the logic of searching for all H3 K28 mutations in HGG subtyping would convert this sample by default - how to handle this?
  4. -
-
-

So we will revise the molecular_subtype, integrated_diagnosis, short_histology, and broad_histology accordingly.

- - - -
compiled_df <- compiled_df %>%
-  mutate(
-    integrated_diagnosis = case_when(
-      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "Ependymoma",
-      TRUE ~ integrated_diagnosis 
-    ),
-    short_histology = case_when(
-      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "Ependymoma",
-      TRUE ~ short_histology
-    ),
-    broad_histology = case_when(
-      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "Ependymal tumor",
-      TRUE ~ broad_histology
-    ),
-    molecular_subtype = case_when(
-      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "EPN, H3 K28",
-      TRUE ~ molecular_subtype
-    ),
-    Notes = case_when(
-      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
-    )
-  )
- - - -
-
-

BS_H1XPVS9A

-

BS_H1XPVS9A is from a sample with a BRAF V600E mutation that is H3 wildtype. This sample was originally labeled as a HGG. In low-dimensional transcriptomic space (e.g., UMAP, t-SNE), BS_H1XPVS9A clusters with LGG samples. (See molecular-subtyping-HGG.)

-

The relevant note from above:

-
-
    -
  1. Pathology confirmed this HGG BRAF V600E mutant tumor, BS_H1XPVS9A to be a LGAT (PXA). I updated molecular_subtype here based on what it would look like, but this should come through via the LGAT subtyping ticket. How should we add this info?
  2. -
-
-

The steps for LGAT subtyping are to classify LGG samples on the basis of the presence/absence of BRAF fusions and BRAF V600E mutations.

- - - -
compiled_df %>%
-  filter(Kids_First_Biospecimen_ID == "BS_H1XPVS9A") %>%
-  select(Kids_First_Participant_ID, sample_id) %>%
-  left_join(compiled_df)
- - -
Joining, by = c("Kids_First_Participant_ID", "sample_id")
- - -
- -
- - - -

We know from molecular-subtyping-HGG that a BRAF V600E mutation is present. Now we have to check for the presence of BRAF fusions.

- - - -
fusions_df %>%
-  filter(str_detect(FusionName, "BRAF"),
-         Sample == "BS_H1XPVS9A")
- - -
- -
- - - -

There are no BRAF fusions in BS_H1XPVS9A, so we are able to classify this sample (7316-1106) as LGG, BRAF V600E.

- - - -
compiled_df <- compiled_df %>%
-  mutate(
-    integrated_diagnosis = case_when(
-      sample_id == "7316-1106" ~ "Low-grade astrocytic tumor",
-      TRUE ~ integrated_diagnosis
-    ),
-    short_histology = case_when(
-      sample_id == "7316-1106" ~ "LGAT",
-      TRUE ~ short_histology
-    ),
-    broad_histology = case_when(
-      sample_id == "7316-1106" ~ "Low-grade astrocytic tumor",
-      TRUE ~ broad_histology
-    ),
-    molecular_subtype = case_when(
-      sample_id == "7316-1106" ~ "LGG, BRAF V600E",
-      TRUE ~ molecular_subtype
-    ),
-    Notes = case_when(
-      sample_id == "7316-1106" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
-    )
-  )
- - - -
-
-

HGG BRAF V600E

-

The follow point comes from another issue #627 (comment):

-
-

We have a standalone BRAF V600E subtype, but this is HGG only, and should be labeled as such (will create an update HGG analysis ticket).

-
- - - -
compiled_df %>%
-  filter(molecular_subtype == "BRAF V600E")
- - -
- -
- - - -

Now that we have addressed the one sample that should have been reclassified as LGG, we are able to update molecular_subtype to HGG, BRAF V600E for the remaining samples.

- - - -
compiled_df <- compiled_df %>%
-  mutate(molecular_subtype = case_when(
-    molecular_subtype == "BRAF V600E" ~ "HGG, BRAF V600E",
-    TRUE ~ molecular_subtype
-  ))
- - - -
-
-

PT_AQWDQW27

-
-
  1. PT_AQWDQW27 specimen was consistent with meningioma, even though it has a hallmark EPN fusion, so pathology would also call this a rare meningioma with a YAP1 fusion.
  2. +
  3. Because 1 is a rare tumor (maybe first seen), the logic of searching for all H3 K28 mutations in HGG subtyping would convert this sample by default - how to handle this?
  4. +
  5. Pathology confirmed this HGG BRAF V600E mutant tumor, BS_H1XPVS9A, to be a LGAT (PXA). I updated molecular_subtype here based on what it would look like, but this should come through via the LGAT subtyping ticket. How should we add this info?
-

The molecular-subtyping-EPN module has not been completed yet, but the logic that is in that module may mean that we need to include revising the labels of PT_AQWDQW27.

- - - -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_AQWDQW27")
- - -
- -
- - -
# This sample is missing from the EPN table, but it should be there - will have to investigate and update this later.
- - - -
-
-

PT_6Q0NPVP3

-

The specimens for this patient, BS_5JM573JC and BS_E5H6CFYT, were classified as HGAT due to the presence of a histone mutation, but with the removal of LGAT from the HGAT module, this sample will no longer show up in two modules.

- - - -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_6Q0NPVP3")
- - -
- -
- - -
-
-

Are there any other duplicate subtypes?

+
+

Set up

- -
unique_subtypes <- compiled_df %>%
-  select(Kids_First_Participant_ID, sample_id, molecular_subtype) %>%
-  distinct()
+
+
# This logic is the same as analyses/gene-set-enrichment-analysis/02-model-gsea.Rmd
+# Assigning params$is_ci to running_in_ci avoids a locked binding error
+running_in_ci <- params$is_ci
 
-unique_subtypes[duplicated(unique_subtypes$sample_id),]
- - -
- -
- - -
#PT_KTRJ8TFY (fixed in clinical feedback) and PT_6Q0NPVP3 (fixed in HGG module removing LGAT)
- - - -
-
-

PT_00G007DM

-

7316-272 is subtyped as ETMR because a C19MC alteration was found and pathology review confirms the new diagnosis

- - - -
compiled_df <- compiled_df %>%
-  mutate(molecular_subtype= case_when(sample_id == "7316-272"~"ETMR, C19MC-altered",
-                                      TRUE ~ molecular_subtype),
-         short_histology= case_when(sample_id == "7316-272"~"ETMR",
-                                      TRUE ~ short_histology),
-         integrated_diagnosis = case_when(sample_id == "7316-272"~"Embryonal tumor with multilayer rosettes, C19MC-altered",
-                                      TRUE ~ integrated_diagnosis),
-         Notes = case_when(sample_id == "7316-272" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
-    )
-  ) %>%
-  unique()
- - - -

This sample has multiple specimens with different diagnoses and subtypes and this is actually expected, as there are two different diagnoses in the CBTN database and the C19MC alteration was only found in one of the samples.

- - - -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_00G007DM")
+# Are we testing? In case of a non 0/1 number, we recast as logical, and then +# ensure logical. +if (running_in_ci %in% c(0,1)) running_in_ci <- as.logical(running_in_ci) +if (!(is.logical(running_in_ci))) +{ + stop("\n\nERROR: The parameter `is_ci` should be FALSE/TRUE (or 0/1).") +}
- -
- -
- -
-
-

PT_5BWZA0NT

-

This sample was inspected by pathology and should be annotated as DMG, H3 K28, so let’s update that.

- -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_5BWZA0NT")
+ +
library(tidyverse)
- -
- -
- + +
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
+ + +
✔ ggplot2 3.3.0     ✔ purrr   0.3.4
+✔ tibble  3.0.0     ✔ dplyr   0.8.5
+✔ tidyr   1.0.2     ✔ stringr 1.4.0
+✔ readr   1.3.1     ✔ forcats 0.5.0
+ + +
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
+✖ dplyr::filter() masks stats::filter()
+✖ dplyr::lag()    masks stats::lag()
+ +
+

Directory and files

+
+

Directories

- -
compiled_df <- compiled_df %>%
-  mutate(
-    integrated_diagnosis = case_when(
-      sample_id == "7316-1102" ~ "Diffuse midline glioma, H3 K28-mutant",
-      TRUE ~ integrated_diagnosis
-    ),
-    short_histology = case_when(
-      sample_id == "7316-1102" ~ "HGAT",
-      TRUE ~ short_histology
-    ),
-    broad_histology = case_when(
-      sample_id == "7316-1102" ~ "Diffuse astrocytic and oligodendroglial tumor",
-      TRUE ~ broad_histology
-    ),
-    molecular_subtype = case_when(
-      sample_id == "7316-1102" ~ "DMG, H3 K28",
-      TRUE ~ molecular_subtype
-    ),
-    Notes = case_when(
-      sample_id == "7316-1102" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
-    )
-  )
+ +
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
+data_dir <- file.path(root_dir, "data")
+results_dir <- "results"
-
-

PT_80NVYCBS

-

This sample was inspected by pathology and should be CNS HGNET-MN1, so we will update here.

+
+

Input

+

When we run this locally, we want to tie it to a specific version of the histologies file prior to feedback we received from pathology that is recorded on #609.

- -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_80NVYCBS")
+ +
if (running_in_ci) {
+  histologies_file <- file.path(data_dir, "pbta-histologies.tsv")
+} else {
+  histologies_file <- file.path(data_dir, "release-v15-20200228",
+                                "pbta-histologies.tsv")
+}
- -
- -
- + + - -
compiled_df <- compiled_df %>%
-  mutate(
-    integrated_diagnosis = case_when(
-      sample_id == "7316-765" ~ "CNS Embryonal Tumor, HGNET-MN1",
-      TRUE ~ integrated_diagnosis
-    ),
-    short_histology = case_when(
-      sample_id == "7316-765" ~ "Embryonal Tumor",
-      TRUE ~ short_histology
-    ),
-    broad_histology = case_when(
-      sample_id == "7316-765" ~ "Embryonal Tumor",
-      TRUE ~ broad_histology
-    ),
-    molecular_subtype = case_when(
-      sample_id == "7316-765" ~ "CNS HGNET-MN1",
-      TRUE ~ molecular_subtype
-    ),
-    Notes = case_when(
-      sample_id == "7316-765" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
-    )
-  )
+ +
compiled_results_file <- file.path(results_dir, 
+                                   "compiled_molecular_subtypes_with_clinical_feedback.tsv")
+fusions_file <- file.path(data_dir,
+                          "pbta-fusion-putative-oncogenic.tsv")
-
-

PT_9BZETM0M

-

This sample was inspected by pathology and should be HGG, H3 G35, so we will update here.

+
+

Output

- -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_9BZETM0M")
- - -
- -
- - - - -
compiled_df <- compiled_df %>%
-  mutate(
-    integrated_diagnosis = case_when(
-      sample_id == "7316-158" ~ "High-grade glioma/astrocytoma, H3 G35-mutant",
-      TRUE ~ integrated_diagnosis
-    ),
-    short_histology = case_when(
-      sample_id == "7316-158" ~ "HGAT",
-      TRUE ~ short_histology
-    ),
-    broad_histology = case_when(
-      sample_id == "7316-158" ~ "Diffuse astrocytic and oligodendroglial tumor",
-      TRUE ~ broad_histology
-    ),
-    molecular_subtype = case_when(
-      sample_id == "7316-158" ~ "HGG, H3 G35",
-      TRUE ~ molecular_subtype
-    ),
-    Notes = case_when(
-      sample_id == "7316-158" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
-    )
-  )
+ +
output_file <- file.path(results_dir,
+                         "compiled_molecular_subtypes_with_clinical_pathology_feedback.tsv")
-
-

PT_C2D4JXS1

-

This sample has one biospecimen which did not have the H3 variant captured in consensus calls - will inspect this later and possibly will be fixed with #819.

+
+
+
+

Read in data

- -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_C2D4JXS1")
+ +
histologies_df <- read_tsv(histologies_file, guess_max = 10000)
+compiled_df <- read_tsv(compiled_results_file)
+fusions_df <- read_tsv(fusions_file)
- -
- -
-
-
-

PT_EHE800JJ

-

This sample has a hallmark EWSR1-FLI1 fusion, so could be re-classified as EWS once it goes through pathology review. For now, we will change it here to EWS.

+
+

Revise subtyping calls based on pathology feedback

+
+

PT_7E3V3JFX

+

PT_7E3V3JFX was classified in molecular-subtyping-HGG as DMG, H3 K28 because the first step in that module was to identify any samples in the cohort with "defining lesions:" H3 K28 or H3 G35 (original subtyping issue: #249).

- +
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_EHE800JJ")
+ filter(Kids_First_Participant_ID == "PT_7E3V3JFX") -
- + +

The relevant notes above are

+
+
    +
  1. PT_7E3V3JFX specimens were consistent with the original EPN dx, so pathology would call this a rare EPN, H3 K28 mutated tumor, rather than DMG.
  2. +
  3. Because 1 is a rare tumor (maybe first seen), the logic of searching for all H3 K28 mutations in HGG subtyping would convert this sample by default - how to handle this?
  4. +
+
+

So we will revise the molecular_subtype, integrated_diagnosis, short_histology, and broad_histology accordingly.

+ - +
compiled_df <- compiled_df %>%
   mutate(
     integrated_diagnosis = case_when(
-      sample_id == "7316-229" ~ "Ewing sarcoma",
-      TRUE ~ integrated_diagnosis
+      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "Ependymoma",
+      TRUE ~ integrated_diagnosis 
     ),
     short_histology = case_when(
-      sample_id == "7316-229" ~ "EWS",
+      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "Ependymoma",
       TRUE ~ short_histology
     ),
     broad_histology = case_when(
-      sample_id == "7316-229" ~ "Mesenchymal non-meningothelial tumor",
+      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "Ependymal tumor",
       TRUE ~ broad_histology
     ),
     molecular_subtype = case_when(
-      sample_id == "7316-229" ~ "EWS",
+      Kids_First_Participant_ID == "PT_7E3V3JFX" ~ "EPN, H3 K28",
       TRUE ~ molecular_subtype
-    ),
-    Notes = case_when(
-      sample_id == "7316-229" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
     )
   )
-
-

PT_KTRJ8TFY

-

This sample has one biospecimen which did not have the H3 variant captured in consensus calls. It has the variant present only in VarDict calls and in IGV, and expect this will be fixed with #819.

+
+

BS_H1XPVS9A

+

BS_H1XPVS9A is from a sample with a BRAF V600E mutation that is H3 wildtype. This sample was originally labeled as a HGG. In low-dimensional transcriptomic space (e.g., UMAP, t-SNE), BS_H1XPVS9A clusters with LGG samples. (See molecular-subtyping-HGG.)

+

The relevant note from above:

+
+
    +
  1. Pathology confirmed this HGG BRAF V600E mutant tumor, BS_H1XPVS9A to be a LGAT (PXA). I updated molecular_subtype here based on what it would look like, but this should come through via the LGAT subtyping ticket. How should we add this info?
  2. +
+
+

The steps for LGAT subtyping are to classify LGG samples on the basis of the presence/absence of BRAF fusions and BRAF V600E mutations.

- +
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_KTRJ8TFY")
+ filter(Kids_First_Biospecimen_ID == "BS_H1XPVS9A") %>% + select(Kids_First_Participant_ID, sample_id) %>% + left_join(compiled_df) - + +
Joining, by = c("Kids_First_Participant_ID", "sample_id")
+
- -
-
-

PT_X648RVMK

-

This sample was reviewed by pathology and confirmed to be ETMR, C19MC-altered. Will change here.

+

We know from molecular-subtyping-HGG that a BRAF V600E mutation is present. Now we have to check for the presence of BRAF fusions.

- -
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_X648RVMK")
+ +
fusions_df %>%
+  filter(str_detect(FusionName, "BRAF"),
+         Sample == "BS_H1XPVS9A")
-
- + +

There are no BRAF fusions in BS_H1XPVS9A, so we are able to classify this sample (7316-1106) as LGG, BRAF V600E.

+ - +
compiled_df <- compiled_df %>%
   mutate(
     integrated_diagnosis = case_when(
-      sample_id == "7316-238" ~ "Embryonal tumor with multilayer rosettes, C19MC-altered",
+      sample_id == "7316-1106" ~ "Low-grade astrocytic tumor",
       TRUE ~ integrated_diagnosis
     ),
     short_histology = case_when(
-      sample_id == "7316-238" ~ "ETMR",
+      sample_id == "7316-1106" ~ "LGAT",
       TRUE ~ short_histology
     ),
     broad_histology = case_when(
-      sample_id == "7316-238" ~ "Embryonal Tumor",
+      sample_id == "7316-1106" ~ "Low-grade astrocytic tumor",
       TRUE ~ broad_histology
     ),
     molecular_subtype = case_when(
-      sample_id == "7316-238" ~ "ETMR, C19MC-altered",
+      sample_id == "7316-1106" ~ "LGG, BRAF V600E",
       TRUE ~ molecular_subtype
     ),
     Notes = case_when(
-      sample_id == "7316-238" ~ "Updated via OpenPBTA subtyping",
+      sample_id == "7316-1106" ~ "Updated via OpenPBTA subtyping",
       TRUE ~ Notes
     )
   )
@@ -4016,56 +980,54 @@

PT_X648RVMK

-
-

PT_X71D7G5S

-

This sample was reviewed by pathology and confirmed to be H3 mutant. Will change here.

+
+

HGG BRAF V600E

+

The follow point comes from another issue #627 (comment):

+
+

We have a standalone BRAF V600E subtype, but this is HGG only, and should be labeled as such (will create an update HGG analysis ticket).

+
- +
compiled_df %>%
-  filter(Kids_First_Participant_ID == "PT_X71D7G5S")
+ filter(molecular_subtype == "BRAF V600E") -
- + +

Now that we have addressed the one sample that should have been reclassified as LGG, we are able to update molecular_subtype to HGG, BRAF V600E for the remaining samples.

+ - +
compiled_df <- compiled_df %>%
-  mutate(
-    integrated_diagnosis = case_when(
-      sample_id == "7316-1105" ~ "High-grade glioma/astrocytoma, H3 G35-mutant",
-      TRUE ~ integrated_diagnosis
-    ),
-    short_histology = case_when(
-      sample_id == "7316-1105" ~ "HGAT",
-      TRUE ~ short_histology
-    ),
-    broad_histology = case_when(
-      sample_id == "7316-1105" ~ "Diffuse astrocytic and oligodendroglial tumor",
-      TRUE ~ broad_histology
-    ),
-    molecular_subtype = case_when(
-      sample_id == "7316-1105" ~ "HGG, H3 G35",
-      TRUE ~ molecular_subtype
-    ),
-    Notes = case_when(sample_id == "7316-1105" ~ "Updated via OpenPBTA subtyping",
-      TRUE ~ Notes
-    )
-  )
+ mutate(molecular_subtype = case_when( + molecular_subtype == "BRAF V600E" ~ "HGG, BRAF V600E", + TRUE ~ molecular_subtype + ))
+
+

PT_AQWDQW27

+
+
    +
  1. PT_AQWDQW27 specimen was consistent with meningioma, even though it has a hallmark EPN fusion, so pathology would also call this a rare meningioma with a YAP1 fusion.
  2. +
+
+

The molecular-subtyping-EPN module has not been completed yet, but the logic that is in that module may mean that we need to include revising the labels of PT_AQWDQW27.

+
# TODO: do we need to update PT_AQWDQW27 once molecular-subtyping-EPN is 
+# complete?
+

Write revised table to file

- +
# sort first
 compiled_df <- compiled_df %>% 
   arrange(Kids_First_Participant_ID, sample_id)
@@ -4079,48 +1041,51 @@ 

Write revised table to file

Session Info

- +
sessionInfo()
- -
R version 3.6.0 (2019-04-26)
-Platform: x86_64-pc-linux-gnu (64-bit)
-Running under: Debian GNU/Linux 9 (stretch)
+
+
R version 3.5.1 (2018-07-02)
+Platform: x86_64-apple-darwin15.6.0 (64-bit)
+Running under: macOS Sierra 10.12.6
 
 Matrix products: default
-BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.19.so
+BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
+LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
 
 locale:
- [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
- [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=C             
- [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
-[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
+[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
 
 attached base packages:
 [1] stats     graphics  grDevices utils     datasets  methods   base     
 
 other attached packages:
-[1] forcats_0.4.0   stringr_1.4.0   dplyr_0.8.3     purrr_0.3.2     readr_1.3.1    
-[6] tidyr_0.8.3     tibble_2.1.3    ggplot2_3.2.0   tidyverse_1.2.1
+[1] forcats_0.5.0   stringr_1.4.0   dplyr_0.8.5     purrr_0.3.4    
+[5] readr_1.3.1     tidyr_1.0.2     tibble_3.0.0    ggplot2_3.3.0  
+[9] tidyverse_1.3.0
 
 loaded via a namespace (and not attached):
- [1] Rcpp_1.0.1       cellranger_1.1.0 pillar_1.4.2     compiler_3.6.0   base64enc_0.1-3 
- [6] tools_3.6.0      digest_0.6.20    evaluate_0.14    jsonlite_1.6     lubridate_1.7.4 
-[11] nlme_3.1-140     gtable_0.3.0     lattice_0.20-38  pkgconfig_2.0.2  rlang_0.4.0     
-[16] cli_1.1.0        rstudioapi_0.10  yaml_2.2.0       haven_2.1.1      xfun_0.8        
-[21] withr_2.1.2      xml2_1.2.0       httr_1.4.0       knitr_1.23       generics_0.0.2  
-[26] hms_0.4.2        rprojroot_1.3-2  grid_3.6.0       tidyselect_0.2.5 glue_1.3.1      
-[31] R6_2.4.0         readxl_1.3.1     rmarkdown_1.13   modelr_0.1.4     magrittr_1.5    
-[36] backports_1.1.4  scales_1.0.0     htmltools_0.3.6  rvest_0.3.4      assertthat_0.2.1
-[41] colorspace_1.4-1 stringi_1.4.3    lazyeval_0.2.2   munsell_0.5.0    broom_0.5.2     
-[46] crayon_1.3.4    
+ [1] tidyselect_1.0.0 xfun_0.12 haven_2.2.0 lattice_0.20-41 + [5] colorspace_1.4-1 vctrs_0.2.4 generics_0.0.2 htmltools_0.4.0 + [9] yaml_2.2.1 base64enc_0.1-3 rlang_0.4.6 pillar_1.4.3 +[13] withr_2.2.0 glue_1.4.0 DBI_1.1.0 dbplyr_1.4.2 +[17] modelr_0.1.6 readxl_1.3.1 lifecycle_0.2.0 munsell_0.5.0 +[21] gtable_0.3.0 cellranger_1.1.0 rvest_0.3.5 evaluate_0.14 +[25] knitr_1.28 fansi_0.4.1 broom_0.5.5 Rcpp_1.0.4 +[29] backports_1.1.6 scales_1.1.0 jsonlite_1.6.1 fs_1.3.1 +[33] hms_0.5.3 digest_0.6.25 stringi_1.4.6 rprojroot_1.3-2 +[37] grid_3.5.1 cli_2.0.2 tools_3.5.1 magrittr_1.5 +[41] crayon_1.3.4 pkgconfig_2.0.3 ellipsis_0.3.0 xml2_1.3.2 +[45] reprex_0.3.0 lubridate_1.7.8 rstudioapi_0.11 assertthat_0.2.1 +[49] rmarkdown_2.3 httr_1.4.1 R6_2.4.1 nlme_3.1-137 +[53] compiler_3.5.1
-
LS0tCnRpdGxlOiAiSW5jb3Jwb3JhdGluZyBDSE9QIHBhdGhvbG9neSBpbnB1dCB0byBtb2xlY3VsYXIgc3VidHlwaW5nIGNhbGxzIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQphdXRob3I6IEphY2x5biBUYXJvbmkgZm9yIEFMU0YgQ0NETCwgSm8gTHlubmUgUm9raXRhIGZvciBEM2IKZGF0ZTogMjAyMApwYXJhbXM6CiAgaXNfY2k6IEZBTFNFCi0tLQoKX0F1dGhvcnNoaXAgYWJvdmUgcmVmZXJzIHRvIHRoaXMgbm90ZWJvb2sgKipvbmx5KiouXwoKIyMgQmFja2dyb3VuZAoKQXMgcGFydCBvZiB0aGlzIHByb2plY3QsIHdlIGhhdmUgdW5kZXJ0YWtlbiBzZXZlcmFsIGFuYWx5c2VzIHRoYXQgdXNlIG1vbGVjdWxhciBkYXRhIHRvIHN1YnR5cGUgb3IgcmVjbGFzc2lmeSBiaW9zcGVjaW1lbnMuIApJbiBzb21lIGNhc2VzLCBvdXIgYW5hbHlzZXMgaGF2ZSByZXN1bHRlZCBpbiBhbiB1cGRhdGUgb2YgdGhlIGBpbnRlZ3JhdGVkX2RpYWdub3Npc2AgZmllbGQgaW5jbHVkZWQgaW4gdGhlIGNsaW5pY2FsIGZpbGUgKGBwYnRhLWhpc3RvbG9naWVzLnRzdmAgW1tkb2NdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2Jsb2IvbWFzdGVyL2RvYy9kYXRhLWZvcm1hdHMubWQjZGF0YS1jYXZlYXRzKV0pLgpIb3dldmVyLCBub3QgYWxsIGxvZ2ljIGluY2x1ZGVkIGluIHRoZSBjb2RlIG9mIHRoZSByZXBvc2l0b3J5IHdhcyB1bHRpbWF0ZWx5IGluIGFncmVlbWVudCB3aXRoIGZlZWRiYWNrIGZyb20gcGF0aG9sb2dpc3RzIGF0IENIT1AuCkluIHRoaXMgbm90ZWJvb2ssIHdlIHdpbGwgbWFrZSBjaGFuZ2VzIGFuZCBkb2N1bWVudCB0aGUgY2FzZXMgd2hlcmUgdGhlIGxvZ2ljIGluIHRoZSBtb2R1bGVzIG9mIHRoZSByZXBvc2l0b3J5IGRldmlhdGUgZnJvbSB0aGUgZmluYWwgbGFiZWxzLgoKIyMgUGF0aG9sb2d5IEZlZWRiYWNrCgpIZXJlLCB3ZSdyZSBjb3B5aW5nIHRoZSB0YWJsZSBmcm9tIFsjNjA2IChjb21tZW50KV0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzYwOSNpc3N1ZWNvbW1lbnQtNjAyODIxMzc2KSBoZXJlOgoKfCBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIHwgZ2xpb21hX2JyYWluX3JlZ2lvbiB8IHNhbXBsZV9pZCB8IGFsaXF1b3RfaWQgfCBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIHwgZXhwZXJpbWVudGFsX3N0cmF0ZWd5IHwgcGF0aG9sb2d5X2RpYWdub3NpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW50ZWdyYXRlZF9kaWFnbm9zaXMgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzIGZyb20gUGF0aCBpbnNwZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdpdmVuIHRvIFJpdGEgMy8xMy8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzaG9ydF9oaXN0b2xvZ3kgfCBicm9hZF9oaXN0b2xvZ3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBicm9hZF9jb21wb3NpdGlvbiB8IE5vdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNhbmNlcl9wcmVkaXNwb3NpdGlvbnMgfCBtb2xlY3VsYXJfc3VidHlwZSAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBCU19DNlpaM0ZZNSAgICAgICAgICAgICAgIHwgaGVtaXNwaGVyaWMgICAgICAgICB8IDczMTYtMTEwNSB8IDQ3MDAxNyAgICAgfCBQVF9YNzFEN0c1UyAgICAgICAgICAgICAgIHwgUk5BLVNlcSAgICAgICAgICAgICAgIHwgU3VwcmF0ZW50b3JpYWwgb3IgU3BpbmFsIENvcmQgUE5FVCAgICAgICAgICAgICAgIHwgSGlnaC1ncmFkZSBnbGlvbWEgICAgICAgICAgICAgICAgICAgICAgICB8IE5vIHBhdGggcmVwb3J0IGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIE9LIHdpdGggbmV3IGR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEgc2xpZGUsIHBhdGhvbG9neSByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIR0FUICAgICAgICAgICAgfCBEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCBIR0csIEgzIEczNSAgICAgICAgIHwKfCBCU19QOFdOOFhFUSAgICAgICAgICAgICAgIHwgaGVtaXNwaGVyaWMgICAgICAgICB8IDczMTYtMTEwNSB8IDU0OTcxMiAgICAgfCBQVF9YNzFEN0c1UyAgICAgICAgICAgICAgIHwgV0dTICAgICAgICAgICAgICAgICAgIHwgU3VwcmF0ZW50b3JpYWwgb3IgU3BpbmFsIENvcmQgUE5FVCAgICAgICAgICAgICAgIHwgSGlnaC1ncmFkZSBnbGlvbWEgICAgICAgICAgICAgICAgICAgICAgICB8IE5vIHBhdGggcmVwb3J0IGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIE9LIHdpdGggbmV3IGR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEgc2xpZGUsIHBhdGhvbG9neSByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIR0FUICAgICAgICAgICAgfCBEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCBIR0csIEgzIEczNSAgICAgICAgIHwKfCBCU18yM003MkFCRyAgICAgICAgICAgICAgIHwgTkEgICAgICAgICAgICAgICAgICB8IDczMTYtNTIzICB8IDU4ODM0MyAgICAgfCBQVF9BUVdEUVcyNyAgICAgICAgICAgICAgIHwgUk5BLVNlcSAgICAgICAgICAgICAgIHwgTWVuaW5naW9tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPC9zPkVwZW5keW1vbWE8L3M+IE1lbmluZ2lvbWEgICAgICAgICAgICAgICAgICAgfCBObyBwYXRoIHJlcG9ydCBhdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV2aWV3ZWQgLSBrZWVwIGFzIG1lbmluZ2lvbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyIHNsaWRlcywgcGF0aG9sb2d5IHJlcG9ydDsgZW1haWwgcmVxdWVzdCBmb3IgcmFkaW9sb2d5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgIHwgPHM+RXBlbmR5bWFsIHR1bW9yPC9zPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IDxzPlNULUVQTi1ZQVA8L3M+ICAgICAgICAgIHwKfCBCU181Sk01NzNKQyAgICAgICAgICAgICAgIHwgaGVtaXNwaGVyaWMgICAgICAgICB8IDczMTYtMjI1NSB8IDcxNzE2NiAgICAgfCBQVF82UTBOUFZQMyAgICAgICAgICAgICAgIHwgUk5BLVNlcSAgICAgICAgICAgICAgIHwgR2FuZ2xpb2dsaW9tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGlmZnVzZSBtaWRsaW5lIGdsaW9tYSAgICAgICAgICAgICAgICAgICB8IFBhdGggcmVwb3J0IGdhbmdsaW9nbGlvbWEgd2l0aCBleHRlbnNpdmUgY2hvbmRyb2lkIG1ldGFwbGFzaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuZWVkIHRvIHJldmlldyByYWRpb2xvZ3kgcmVwb3J0OyBpZiBub3QgZGlmZnVzZSwgZ2FuZ2xpb2dsaW9tYSwgSDMgbXV0IC0gY2Fubm90IHJldmlldyB8IHBhdGhvbG9neSByZXBvcnQgKG5vIHNsaWRlcyAtIGZyb20gUGl0dCk7IGVtYWlsIHJlcXVlc3QgZm9yIHJhZGlvbG9neSAtIHdpbGwgbm90IHJlY2VpdmUgaW4gdGhlIHNob3J0IHRlcm0gfCBIR0FUICAgICAgICAgICAgfCBEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCBETUcsIEgzIEsyOCAgICAgICAgIHwKfCBCU19FNUg2Q0ZZVCAgICAgICAgICAgICAgIHwgaGVtaXNwaGVyaWMgICAgICAgICB8IDczMTYtMjI1NSB8IDcxMTEzNCAgICAgfCBQVF82UTBOUFZQMyAgICAgICAgICAgICAgIHwgV0dTICAgICAgICAgICAgICAgICAgIHwgR2FuZ2xpb2dsaW9tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGlmZnVzZSBtaWRsaW5lIGdsaW9tYSAgICAgICAgICAgICAgICAgICB8IFBhdGggcmVwb3J0IGdhbmdsaW9nbGlvbWEgd2l0aCBleHRlbnNpdmUgY2hvbmRyb2lkIG1ldGFwbGFzaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuZWVkIHRvIHJldmlldyByYWRpb2xvZ3kgcmVwb3J0OyBpZiBub3QgZGlmZnVzZSwgZ2FuZ2xpb2dsaW9tYSwgSDMgbXV0IC0gY2Fubm90IHJldmlldyB8IHBhdGhvbG9neSByZXBvcnQgKG5vIHNsaWRlcyAtIGZyb20gUGl0dCk7IGVtYWlsIHJlcXVlc3QgZm9yIHJhZGlvbG9neSAtIHdpbGwgbm90IHJlY2VpdmUgaW4gdGhlIHNob3J0IHRlcm0gfCBIR0FUICAgICAgICAgICAgfCBEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCBETUcsIEgzIEsyOCAgICAgICAgIHwKfCBCU19CRkRFWksxQyAgICAgICAgICAgICAgIHwgb3RoZXIgICAgICAgICAgICAgICB8IDczMTYtMTEwMiB8IDU0OTcxNCAgICAgfCBQVF81QldaQTBOVCAgICAgICAgICAgICAgIHwgV0dTICAgICAgICAgICAgICAgICAgIHwgU3VwcmF0ZW50b3JpYWwgb3IgU3BpbmFsIENvcmQgUE5FVCAgICAgICAgICAgICAgIHwgRGlmZnVzZSBtaWRsaW5lIGdsaW9tYSAgICAgICAgICAgICAgICAgICB8IE5vIHBhdGggcmVwb3J0IGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIE9LIHdpdGggbmV3IGR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgc2xpZGVzLCBwYXRob2xvZ3kgcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIR0FUICAgICAgICAgICAgfCBEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCBETUcsIEgzIEsyOCAgICAgICAgIHwKfCBCU19NQjdXTjBaQiAgICAgICAgICAgICAgIHwgb3RoZXIgICAgICAgICAgICAgICB8IDczMTYtMTEwMiB8IDQ3MDAzMSAgICAgfCBQVF81QldaQTBOVCAgICAgICAgICAgICAgIHwgUk5BLVNlcSAgICAgICAgICAgICAgIHwgU3VwcmF0ZW50b3JpYWwgb3IgU3BpbmFsIENvcmQgUE5FVCAgICAgICAgICAgICAgIHwgRGlmZnVzZSBtaWRsaW5lIGdsaW9tYSAgICAgICAgICAgICAgICAgICB8IE5vIHBhdGggcmVwb3J0IGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIE9LIHdpdGggbmV3IGR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgc2xpZGVzLCBwYXRob2xvZ3kgcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIR0FUICAgICAgICAgICAgfCBEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCBETUcsIEgzIEsyOCAgICAgICAgIHwKfCBCU19IMVhQVlM5QSAgICAgICAgICAgICAgIHwgaGVtaXNwaGVyaWMgICAgICAgICB8IDczMTYtMTEwNiB8IDU0OTU3NSAgICAgfCBQVF9UOFY5RVM5MyAgICAgICAgICAgICAgIHwgUk5BLVNlcSAgICAgICAgICAgICAgIHwgSGlnaC1ncmFkZSBnbGlvbWEvYXN0cm9jeXRvbWEgKFdITyBncmFkZSBJSUkvSVYpIHwgPHM+SGlnaC1ncmFkZSBnbGlvbWE8L3M+IExvdy1ncmFkZSBnbGlvbWEgICAgICAgfCBObyBwYXRoIHJlcG9ydCBhdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAoUFhBL0xHRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyIHNsaWRlcywgcGF0aG9sb2d5IHJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEdBVCAgICAgICAgICAgIHwgPHM+RGlmZnVzZSBhc3Ryb2N5dGljIGFuZCBvbGlnb2RlbmRyb2dsaWFsIHR1bW9yPC9zPiBMb3ctZ3JhZGUgYXN0cm9jeXRpYyB0dW1vciB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IExHRywgQlJBRiBWNjAwRSAgICAgICAgICB8CnwgQlNfSjRFOVNXNTEgICAgICAgICAgICAgICB8IGhlbWlzcGhlcmljICAgICAgICAgfCA3MzE2LTExMDYgfCA1NDk3MDggICAgIHwgUFRfVDhWOUVTOTMgICAgICAgICAgICAgICB8IFdHUyAgICAgICAgICAgICAgICAgICB8IEhpZ2gtZ3JhZGUgZ2xpb21hL2FzdHJvY3l0b21hIChXSE8gZ3JhZGUgSUlJL0lWKSB8IDxzPkhpZ2gtZ3JhZGUgZ2xpb21hPC9zPiBMb3ctZ3JhZGUgZ2xpb21hICAgICAgIHwgTm8gcGF0aCByZXBvcnQgYXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggKFBYQS9MR0cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiBzbGlkZXMsIHBhdGhvbG9neSByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IDxzPkRpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vcjwvcz4gTG93LWdyYWRlIGFzdHJvY3l0aWMgdHVtb3IgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCBMR0csIEJSQUYgVjYwMEUgICAgICAgICAgfAp8IEJTX0o4Vlg0RDE3ICAgICAgICAgICAgICAgfCBtaXhlZCAgICAgICAgICAgICAgIHwgNzMxNi01MDYgIHwgNTg4Mjk5ICAgICB8IFBUXzdFM1YzSkZYICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBFcGVuZHltb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA8cz5EaWZmdXNlIG1pZGxpbmUgZ2xpb21hPC9zPiBFcGVuZHltb21hICAgICAgICB8IFBhdGggcmVwb3J0IHBvc3RlcmlvciBmb3NzYSBlcGVuZHltb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIGtlZXAgRVBOIHdpdGggSDMgbXV0LSByYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIR0FUICAgICAgICAgICAgfCA8cz5EaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3I8L3M+IEVwZW5keW1hbCB0dW1vciAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgPHM+RE1HLCBIMyBLMjg8L3M+ICAgICAgICAgfAp8IEJTX0cxNk5NNVdKICAgICAgICAgICAgICAgfCBtaXhlZCAgICAgICAgICAgICAgIHwgNzMxNi01MDYgIHwgNTg4MDExICAgICB8IFBUXzdFM1YzSkZYICAgICAgICAgICAgICAgfCBXR1MgICAgICAgICAgICAgICAgICAgfCBFcGVuZHltb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA8cz5EaWZmdXNlIG1pZGxpbmUgZ2xpb21hPC9zPiBFcGVuZHltb21hICAgICAgICB8IFBhdGggcmVwb3J0IHBvc3RlcmlvciBmb3NzYSBlcGVuZHltb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIGtlZXAgRVBOIHdpdGggSDMgbXV0LSByYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIR0FUICAgICAgICAgICAgfCA8cz5EaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3I8L3M+IEVwZW5keW1hbCB0dW1vciAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgPHM+RE1HLCBIMyBLMjg8L3M+ICAgICAgICAgfAp8IEJTX0tTS1o5SjdKICAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgIHwgNzMxNi03NjUgIHwgNDcwNzMxICAgICB8IFBUXzgwTlZZQ0JTICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBFcGVuZHltb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDTlMgRW1icnlvbmFsIFR1bW9yICAgICAgICAgICAgICAgICAgICAgIHwgUGF0aCByZXBvcnQgYW5hcGxhc3RpYyBlcGVuZHltb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVtYnJ5b25hbCBUdW1vciB8IEVtYnJ5b25hbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IENOUyBIR05FVC1NTjEgICAgICAgfAp8IEJTX0swN0tOVEZZICAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgIHwgNzMxNi0yNzIgIHwgNTg4MDAxICAgICB8IFBUXzAwRzAwN0RNICAgICAgICAgICAgICAgfCBXR1MgICAgICAgICAgICAgICAgICAgfCBNZWR1bGxvYmxhc3RvbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbWJyeW9uYWwgdHVtb3Igd2l0aCBtdWx0aWxheWVyIHJvc2V0dGVzIHwgUGF0aCByZXBvcnQgaGFkICJtZWR1bGxvYmxhc3RvbWEiIGhhbmR3cml0dGVuLCBidXQgZmluYWwgZHggRVRNUiB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVUTVIgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEVUTVIsIEMxOU1DLWFsdGVyZWQgfAp8IEJTX1FXTkJaOVJKICAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgIHwgNzMxNi0yNzIgIHwgNTg4Mjg3ICAgICB8IFBUXzAwRzAwN0RNICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBNZWR1bGxvYmxhc3RvbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbWJyeW9uYWwgdHVtb3Igd2l0aCBtdWx0aWxheWVyIHJvc2V0dGVzIHwgUGF0aCByZXBvcnQgaGFkICJtZWR1bGxvYmxhc3RvbWEiIGhhbmR3cml0dGVuLCBidXQgZmluYWwgZHggRVRNUiB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVUTVIgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEVUTVIsIEMxOU1DLWFsdGVyZWQgfAp8IEJTX1AzOVNRUFRTICAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgIHwgNzMxNi00NDcgIHwgNTg4MzAwICAgICB8IFBUXzAxTVo2MktHICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBQaW5lb2JsYXN0b21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbWJyeW9uYWwgdHVtb3Igd2l0aCBtdWx0aWxheWVyIHJvc2V0dGVzIHwgUGF0aCByZXBvcnQgUE5FVC9waW5lb2JsYXN0b21hOyAidGhlcmUgYXJlIHNjYXR0ZXJlZCB0cnVlIHJvc2V0dGVzIChGbGV4bmVyLVdpbnRlcnN0ZWluZXIpIiB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVUTVIgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEVUTVIsIEMxOU1DLWFsdGVyZWQgfAp8IEJTX1RFOFFGRjdUICAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgIHwgNzMxNi00NDcgIHwgNTg4MDEyICAgICB8IFBUXzAxTVo2MktHICAgICAgICAgICAgICAgfCBXR1MgICAgICAgICAgICAgICAgICAgfCBQaW5lb2JsYXN0b21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbWJyeW9uYWwgdHVtb3Igd2l0aCBtdWx0aWxheWVyIHJvc2V0dGVzIHwgUGF0aCByZXBvcnQgUE5FVC9waW5lb2JsYXN0b21hOyAidGhlcmUgYXJlIHNjYXR0ZXJlZCB0cnVlIHJvc2V0dGVzIChGbGV4bmVyLVdpbnRlcnN0ZWluZXIpIiB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVUTVIgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEVUTVIsIEMxOU1DLWFsdGVyZWQgfAp8IEJTX042TjE0N0JZICAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgIHwgNzMxNi0yMzggIHwgMjMyMDk2ICAgICB8IFBUX1g2NDhSVk1LICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBIaWdoLWdyYWRlIGdsaW9tYS9hc3Ryb2N5dG9tYSAoV0hPIGdyYWRlIElJSS9JVikgfCBFbWJyeW9uYWwgdHVtb3Igd2l0aCBtdWx0aWxheWVyIHJvc2V0dGVzIHwgUGF0aCByZXBvcnQgaGFuZHdyaXR0ZW4gImhpZ2ggZ3JhZGUgZ2xpb21hIjsgZmluYWwgZHggaW5maWx0cmF0aW5nIGdsaW9uZXVyb25hbCBuZW9wbGFzbSAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggKEVUTVIgb3JpZ2luYWwgdHVtb3IgNzMxNi0yOTc1IGFuZCB0aGlzIG9uZSBjb25zaXN0ZW50KSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVUTVIgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEVUTVIsIEMxOU1DLWFsdGVyZWQgfAp8IEJTXzVQMVROMTBaICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0xNTggIHwgNzQ2MDYxICAgICB8IFBUXzlCWkVUTTBNICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBTdXByYXRlbnRvcmlhbCBvciBTcGluYWwgQ29yZCBQTkVUICAgICAgICAgICAgICAgfCBIaWdoLWdyYWRlIGdsaW9tYSAgICAgICAgICAgICAgICAgICAgICAgIHwgUGF0aCByZXBvcnQgUE5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggZ3JhZGUgSUlJLUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgZnJvbSBQTkVUIHRvIEhHRyBkdWUgdG8gSDNGM0EgbXV0YXRpb247VXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEhHRywgSDMgRzM1ICAgICAgICAgfAp8IEJTX1NUTkg3WVNYICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0xNTggIHwgNzQ2MDU2ICAgICB8IFBUXzlCWkVUTTBNICAgICAgICAgICAgICAgfCBXR1MgICAgICAgICAgICAgICAgICAgfCBTdXByYXRlbnRvcmlhbCBvciBTcGluYWwgQ29yZCBQTkVUICAgICAgICAgICAgICAgfCBIaWdoLWdyYWRlIGdsaW9tYSAgICAgICAgICAgICAgICAgICAgICAgIHwgUGF0aCByZXBvcnQgUE5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggZ3JhZGUgSUlJLUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgZnJvbSBQTkVUIHRvIEhHRyBkdWUgdG8gSDNGM0EgbXV0YXRpb247VXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEhHRywgSDMgRzM1ICAgICAgICAgfAp8IEJTX1RWNUI4NlpEICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0xNTggIHwgMTUwNTkzICAgICB8IFBUXzlCWkVUTTBNICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBTdXByYXRlbnRvcmlhbCBvciBTcGluYWwgQ29yZCBQTkVUICAgICAgICAgICAgICAgfCBIaWdoLWdyYWRlIGdsaW9tYSAgICAgICAgICAgICAgICAgICAgICAgIHwgUGF0aCByZXBvcnQgUE5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggZ3JhZGUgSUlJLUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgZnJvbSBQTkVUIHRvIEhHRyBkdWUgdG8gSDNGM0EgbXV0YXRpb247VXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEhHRywgSDMgRzM1ICAgICAgICAgfAoKQW5kIHRoZSBub3RlczoKCj4gIyMjIyBGZXcgbm90ZXM6Cj4gMS4gYFBUXzdFM1YzSkZYYCBzcGVjaW1lbnMgd2VyZSBjb25zaXN0ZW50IHdpdGggdGhlIG9yaWdpbmFsIEVQTiBkeCwgc28gcGF0aG9sb2d5IHdvdWxkIGNhbGwgdGhpcyBhIHJhcmUgRVBOLCBIMyBLMjggbXV0YXRlZCB0dW1vciwgcmF0aGVyIHRoYW4gRE1HLgo+IDIuIGBQVF9BUVdEUVcyN2Agc3BlY2ltZW4gd2FzIGNvbnNpc3RlbnQgd2l0aCBtZW5pbmdpb21hLCBldmVuIHRob3VnaCBpdCBoYXMgYSBoYWxsbWFyayBFUE4gZnVzaW9uLCBzbyBwYXRob2xvZ3kgd291bGQgYWxzbyBjYWxsIHRoaXMgYSByYXJlIG1lbmluZ2lvbWEgd2l0aCBhIF9ZQVAxXyBmdXNpb24uCj4gMy4gQmVjYXVzZSAxIGlzIGEgcmFyZSB0dW1vciAobWF5YmUgZmlyc3Qgc2VlbiksIHRoZSBsb2dpYyBvZiBzZWFyY2hpbmcgZm9yIGFsbCBIMyBLMjggbXV0YXRpb25zIGluIFtIR0cgc3VidHlwaW5nXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvMjQ5KSB3b3VsZCBjb252ZXJ0IHRoaXMgc2FtcGxlIGJ5IGRlZmF1bHQuCj4gIDQuIFBhdGhvbG9neSBjb25maXJtZWQgdGhpcyBIR0cgQlJBRiBWNjAwRSBtdXRhbnQgdHVtb3IsIFtgQlNfSDFYUFZTOUFgXShodHRwczovL2NiZXRoZWxsLmdpdGh1Yi5pby9vcGVuLXBidGEtb3V0cHV0LzA5LUhHRy13aXRoLWJyYWYtY2x1c3RlcmluZy5uYi5odG1sI2lkZW50aWZ5X3NhbXBsZV90aGF0X2NsdXN0ZXJzX3dpdGhfbGdhdCksIHRvIGJlIGEgTEdBVCAoUFhBKS4gSSB1cGRhdGVkIGBtb2xlY3VsYXJfc3VidHlwZWAgaGVyZSBiYXNlZCBvbiB3aGF0IGl0IHdvdWxkIGxvb2sgbGlrZSwgYnV0IHRoaXMgc2hvdWxkIGNvbWUgdGhyb3VnaCB2aWEgdGhlIExHQVQgW3N1YnR5cGluZ10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzYzMSkgdGlja2V0LiBIb3cgc2hvdWxkIHdlIGFkZCB0aGlzIGluZm8/CgojIyBTZXQgdXAgCgpgYGB7cn0KIyBUaGlzIGxvZ2ljIGlzIHRoZSBzYW1lIGFzIGFuYWx5c2VzL2dlbmUtc2V0LWVucmljaG1lbnQtYW5hbHlzaXMvMDItbW9kZWwtZ3NlYS5SbWQKIyBBc3NpZ25pbmcgcGFyYW1zJGlzX2NpIHRvIHJ1bm5pbmdfaW5fY2kgYXZvaWRzIGEgbG9ja2VkIGJpbmRpbmcgZXJyb3IKcnVubmluZ19pbl9jaSA8LSBwYXJhbXMkaXNfY2kKCiMgQXJlIHdlIHRlc3Rpbmc/IEluIGNhc2Ugb2YgYSBub24gMC8xIG51bWJlciwgd2UgcmVjYXN0IGFzIGxvZ2ljYWwsIGFuZCB0aGVuIAojIGVuc3VyZSBsb2dpY2FsLgppZiAocnVubmluZ19pbl9jaSAlaW4lIGMoMCwxKSkgcnVubmluZ19pbl9jaSA8LSBhcy5sb2dpY2FsKHJ1bm5pbmdfaW5fY2kpCmlmICghKGlzLmxvZ2ljYWwocnVubmluZ19pbl9jaSkpKQp7CiAgc3RvcCgiXG5cbkVSUk9SOiBUaGUgcGFyYW1ldGVyIGBpc19jaWAgc2hvdWxkIGJlIEZBTFNFL1RSVUUgKG9yIDAvMSkuIikKfQpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCiMjIyBEaXJlY3RvcnkgYW5kIGZpbGVzCgojIyMjIERpcmVjdG9yaWVzCgpgYGB7cn0Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCmRhdGFfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgImRhdGEiKQpyZXN1bHRzX2RpciA8LSAicmVzdWx0cyIKYGBgCgojIyMjIElucHV0CgpXaGVuIHdlIHJ1biB0aGlzIGxvY2FsbHksIHdlIHdhbnQgdG8gdGllIGl0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaGlzdG9sb2dpZXMgZmlsZSBfcHJpb3JfIHRvIGZlZWRiYWNrIHdlIHJlY2VpdmVkIGZyb20gcGF0aG9sb2d5IHRoYXQgaXMgcmVjb3JkZWQgb24gWyM2MDldKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy82MDkpLgoKYGBge3J9CmlmIChydW5uaW5nX2luX2NpKSB7CiAgaGlzdG9sb2dpZXNfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJwYnRhLWhpc3RvbG9naWVzLnRzdiIpCn0gZWxzZSB7CiAgaGlzdG9sb2dpZXNfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJyZWxlYXNlLXYxNy0yMDIwMDkwOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBidGEtaGlzdG9sb2dpZXMudHN2IikKfQpgYGAKCmBgYHtyfQpjb21waWxlZF9yZXN1bHRzX2ZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZWRfbW9sZWN1bGFyX3N1YnR5cGVzX3dpdGhfY2xpbmljYWxfZmVlZGJhY2sudHN2IikKZnVzaW9uc19maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAicGJ0YS1mdXNpb24tcHV0YXRpdmUtb25jb2dlbmljLnRzdiIpCmBgYAoKIyMjIyBPdXRwdXQKCmBgYHtyfQpvdXRwdXRfZmlsZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZWRfbW9sZWN1bGFyX3N1YnR5cGVzX3dpdGhfY2xpbmljYWxfcGF0aG9sb2d5X2ZlZWRiYWNrLnRzdiIpCmBgYAoKIyMgUmVhZCBpbiBkYXRhCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpoaXN0b2xvZ2llc19kZiA8LSByZWFkX3RzdihoaXN0b2xvZ2llc19maWxlLCBndWVzc19tYXggPSAxMDAwMCkKY29tcGlsZWRfZGYgPC0gcmVhZF90c3YoY29tcGlsZWRfcmVzdWx0c19maWxlKQpmdXNpb25zX2RmIDwtIHJlYWRfdHN2KGZ1c2lvbnNfZmlsZSkKYGBgCgojIyBSZXZpc2Ugc3VidHlwaW5nIGNhbGxzIGJhc2VkIG9uIHBhdGhvbG9neSBmZWVkYmFjawoKIyMjIGBQVF83RTNWM0pGWGAKCmBQVF83RTNWM0pGWGAgd2FzIGNsYXNzaWZpZWQgaW4gYG1vbGVjdWxhci1zdWJ0eXBpbmctSEdHYCBhcyBgRE1HLCBIMyBLMjhgIGJlY2F1c2UgdGhlIGZpcnN0IHN0ZXAgaW4gdGhhdCBtb2R1bGUgd2FzIHRvIGlkZW50aWZ5IGFueSBzYW1wbGVzIGluIHRoZSBjb2hvcnQgd2l0aCAiZGVmaW5pbmcgbGVzaW9uczoiIEgzIEsyOCBvciBIMyBHMzUgKG9yaWdpbmFsIHN1YnR5cGluZyBpc3N1ZTogWyMyNDldKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8yNDkpKS4KCmBgYHtyfQpjb21waWxlZF9kZiAlPiUKICBmaWx0ZXIoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfN0UzVjNKRlgiKQpgYGAKClRoZSByZWxldmFudCBub3RlcyBhYm92ZSBhcmUKCj4gMS4gYFBUXzdFM1YzSkZYYCBzcGVjaW1lbnMgd2VyZSBjb25zaXN0ZW50IHdpdGggdGhlIG9yaWdpbmFsIEVQTiBkeCwgc28gcGF0aG9sb2d5IHdvdWxkIGNhbGwgdGhpcyBhIHJhcmUgRVBOLCBIMyBLMjggbXV0YXRlZCB0dW1vciwgcmF0aGVyIHRoYW4gRE1HLgo+IDMuIEJlY2F1c2UgMSBpcyBhIHJhcmUgdHVtb3IgKG1heWJlIGZpcnN0IHNlZW4pLCB0aGUgbG9naWMgb2Ygc2VhcmNoaW5nIGZvciBhbGwgSDMgSzI4IG11dGF0aW9ucyBpbiBbSEdHIHN1YnR5cGluZ10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzI0OSkgd291bGQgY29udmVydCB0aGlzIHNhbXBsZSBieSBkZWZhdWx0IC0gaG93IHRvIGhhbmRsZSB0aGlzPyAKClNvIHdlIHdpbGwgcmV2aXNlIHRoZSBgbW9sZWN1bGFyX3N1YnR5cGVgLCBgaW50ZWdyYXRlZF9kaWFnbm9zaXNgLCBgc2hvcnRfaGlzdG9sb2d5YCwgYW5kIGBicm9hZF9oaXN0b2xvZ3lgIGFjY29yZGluZ2x5LgoKYGBge3J9CmNvbXBpbGVkX2RmIDwtIGNvbXBpbGVkX2RmICU+JQogIG11dGF0ZSgKICAgIGludGVncmF0ZWRfZGlhZ25vc2lzID0gY2FzZV93aGVuKAogICAgICBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEID09ICJQVF83RTNWM0pGWCIgfiAiRXBlbmR5bW9tYSIsCiAgICAgIFRSVUUgfiBpbnRlZ3JhdGVkX2RpYWdub3NpcyAKICAgICksCiAgICBzaG9ydF9oaXN0b2xvZ3kgPSBjYXNlX3doZW4oCiAgICAgIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUXzdFM1YzSkZYIiB+ICJFcGVuZHltb21hIiwKICAgICAgVFJVRSB+IHNob3J0X2hpc3RvbG9neQogICAgKSwKICAgIGJyb2FkX2hpc3RvbG9neSA9IGNhc2Vfd2hlbigKICAgICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfN0UzVjNKRlgiIH4gIkVwZW5keW1hbCB0dW1vciIsCiAgICAgIFRSVUUgfiBicm9hZF9oaXN0b2xvZ3kKICAgICksCiAgICBtb2xlY3VsYXJfc3VidHlwZSA9IGNhc2Vfd2hlbigKICAgICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfN0UzVjNKRlgiIH4gIkVQTiwgSDMgSzI4IiwKICAgICAgVFJVRSB+IG1vbGVjdWxhcl9zdWJ0eXBlCiAgICApLAogICAgTm90ZXMgPSBjYXNlX3doZW4oCiAgICAgIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUXzdFM1YzSkZYIiB+ICJVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmciLAogICAgICBUUlVFIH4gTm90ZXMKICAgICkKICApCmBgYAoKIyMjIGBCU19IMVhQVlM5QWAKCmBCU19IMVhQVlM5QWAgaXMgZnJvbSBhIHNhbXBsZSB3aXRoIGEgQlJBRiBWNjAwRSBtdXRhdGlvbiB0aGF0IGlzIEgzIHdpbGR0eXBlLgpUaGlzIHNhbXBsZSB3YXMgb3JpZ2luYWxseSBsYWJlbGVkIGFzIGEgSEdHLgpJbiBsb3ctZGltZW5zaW9uYWwgdHJhbnNjcmlwdG9taWMgc3BhY2UgKGUuZy4sIFVNQVAsIHQtU05FKSwgYEJTX0gxWFBWUzlBYCBjbHVzdGVycyB3aXRoIExHRyBzYW1wbGVzLgooU2VlIGBtb2xlY3VsYXItc3VidHlwaW5nLUhHR2AuKQoKVGhlIHJlbGV2YW50IG5vdGUgZnJvbSBhYm92ZToKCj4gIDQuIFBhdGhvbG9neSBjb25maXJtZWQgdGhpcyBIR0cgQlJBRiBWNjAwRSBtdXRhbnQgdHVtb3IsIGBCU19IMVhQVlM5QWAKdG8gYmUgYSBMR0FUIChQWEEpLiBJIHVwZGF0ZWQgYG1vbGVjdWxhcl9zdWJ0eXBlYCBoZXJlIGJhc2VkIG9uIHdoYXQgaXQgd291bGQgbG9vayBsaWtlLCBidXQgdGhpcyBzaG91bGQgY29tZSB0aHJvdWdoIHZpYSB0aGUgTEdBVCBbc3VidHlwaW5nXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvNjMxKSB0aWNrZXQuIEhvdyBzaG91bGQgd2UgYWRkIHRoaXMgaW5mbz8KClRoZSBzdGVwcyBmb3IgTEdBVCBzdWJ0eXBpbmcgYXJlIHRvIGNsYXNzaWZ5IExHRyBzYW1wbGVzIG9uIHRoZSBiYXNpcyBvZiB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiBfQlJBRl8gZnVzaW9ucyBhbmQgQlJBRiBWNjAwRSBtdXRhdGlvbnMuCgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQgPT0gIkJTX0gxWFBWUzlBIikgJT4lCiAgc2VsZWN0KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHNhbXBsZV9pZCkgJT4lCiAgbGVmdF9qb2luKGNvbXBpbGVkX2RmKQpgYGAKCldlIGtub3cgZnJvbSBgbW9sZWN1bGFyLXN1YnR5cGluZy1IR0dgIHRoYXQgYSBCUkFGIFY2MDBFIG11dGF0aW9uIGlzIHByZXNlbnQuCk5vdyB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgX0JSQUZfIGZ1c2lvbnMuCgpgYGB7cn0KZnVzaW9uc19kZiAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChGdXNpb25OYW1lLCAiQlJBRiIpLAogICAgICAgICBTYW1wbGUgPT0gIkJTX0gxWFBWUzlBIikKYGBgCgpUaGVyZSBhcmUgbm8gX0JSQUZfIGZ1c2lvbnMgaW4gYEJTX0gxWFBWUzlBYCwgc28gd2UgYXJlIGFibGUgdG8gY2xhc3NpZnkgdGhpcyBzYW1wbGUgKGA3MzE2LTExMDZgKSBhcyBgTEdHLCBCUkFGIFY2MDBFYC4KCmBgYHtyfQpjb21waWxlZF9kZiA8LSBjb21waWxlZF9kZiAlPiUKICBtdXRhdGUoCiAgICBpbnRlZ3JhdGVkX2RpYWdub3NpcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTExMDYiIH4gIkxvdy1ncmFkZSBhc3Ryb2N5dGljIHR1bW9yIiwKICAgICAgVFJVRSB+IGludGVncmF0ZWRfZGlhZ25vc2lzCiAgICApLAogICAgc2hvcnRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTEwNiIgfiAiTEdBVCIsCiAgICAgIFRSVUUgfiBzaG9ydF9oaXN0b2xvZ3kKICAgICksCiAgICBicm9hZF9oaXN0b2xvZ3kgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xMTA2IiB+ICJMb3ctZ3JhZGUgYXN0cm9jeXRpYyB0dW1vciIsCiAgICAgIFRSVUUgfiBicm9hZF9oaXN0b2xvZ3kKICAgICksCiAgICBtb2xlY3VsYXJfc3VidHlwZSA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTExMDYiIH4gIkxHRywgQlJBRiBWNjAwRSIsCiAgICAgIFRSVUUgfiBtb2xlY3VsYXJfc3VidHlwZQogICAgKSwKICAgIE5vdGVzID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTEwNiIgfiAiVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nIiwKICAgICAgVFJVRSB+IE5vdGVzCiAgICApCiAgKQpgYGAKCiMjIyBIR0cgQlJBRiBWNjAwRSAKCldlIHdpbGwgYmUgcmVtb3ZpbmcgdGhpcyBmcm9tIHN1YnR5cGluZywgc28gdGhpcyBjYW4gYmUgbGVmdCBmb3Igbm93CgpUaGUgZm9sbG93IHBvaW50IGNvbWVzIGZyb20gYW5vdGhlciBpc3N1ZSBbIzYyNyAoY29tbWVudCldKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy82MjcjaXNzdWVjb21tZW50LTU5ODc4OTIzMik6Cgo+IFdlIGhhdmUgYSBzdGFuZGFsb25lIEJSQUYgVjYwMEUgc3VidHlwZSwgYnV0IHRoaXMgaXMgSEdHIG9ubHksIGFuZCBzaG91bGQgYmUgbGFiZWxlZCBhcyBzdWNoICh3aWxsIGNyZWF0ZSBhbiB1cGRhdGUgSEdHIGFuYWx5c2lzIHRpY2tldCkuCgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKG1vbGVjdWxhcl9zdWJ0eXBlID09ICJCUkFGIFY2MDBFIikKYGBgCgpOb3cgdGhhdCB3ZSBoYXZlIGFkZHJlc3NlZCB0aGUgb25lIHNhbXBsZSB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcmVjbGFzc2lmaWVkIGFzIExHRywgd2UgYXJlIGFibGUgdG8gdXBkYXRlIGBtb2xlY3VsYXJfc3VidHlwZWAgdG8gYEhHRywgQlJBRiBWNjAwRWAgZm9yIHRoZSByZW1haW5pbmcgc2FtcGxlcy4KCmBgYHtyfQpjb21waWxlZF9kZiA8LSBjb21waWxlZF9kZiAlPiUKICBtdXRhdGUobW9sZWN1bGFyX3N1YnR5cGUgPSBjYXNlX3doZW4oCiAgICBtb2xlY3VsYXJfc3VidHlwZSA9PSAiQlJBRiBWNjAwRSIgfiAiSEdHLCBCUkFGIFY2MDBFIiwKICAgIFRSVUUgfiBtb2xlY3VsYXJfc3VidHlwZQogICkpCmBgYAoKIyMjIGBQVF9BUVdEUVcyN2AKCj4gMi4gYFBUX0FRV0RRVzI3YCBzcGVjaW1lbiB3YXMgY29uc2lzdGVudCB3aXRoIG1lbmluZ2lvbWEsIGV2ZW4gdGhvdWdoIGl0IGhhcyBhIGhhbGxtYXJrIEVQTiBmdXNpb24sIHNvIHBhdGhvbG9neSB3b3VsZCBhbHNvIGNhbGwgdGhpcyBhIHJhcmUgbWVuaW5naW9tYSB3aXRoIGEgX1lBUDFfIGZ1c2lvbi4KClRoZSBgbW9sZWN1bGFyLXN1YnR5cGluZy1FUE5gIG1vZHVsZSBoYXMgbm90IGJlZW4gY29tcGxldGVkIHlldCwgYnV0IHRoZSBsb2dpYyB0aGF0IGlzIGluIHRoYXQgbW9kdWxlIG1heSBtZWFuIHRoYXQgd2UgbmVlZCB0byBpbmNsdWRlIHJldmlzaW5nIHRoZSBsYWJlbHMgb2YgYFBUX0FRV0RRVzI3YC4KCmBgYHtyfQpjb21waWxlZF9kZiAlPiUKICBmaWx0ZXIoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfQVFXRFFXMjciKQojIFRoaXMgc2FtcGxlIGlzIG1pc3NpbmcgZnJvbSB0aGUgRVBOIHRhYmxlLCBidXQgaXQgc2hvdWxkIGJlIHRoZXJlIC0gd2lsbCBoYXZlIHRvIGludmVzdGlnYXRlIGFuZCB1cGRhdGUgdGhpcyBsYXRlci4KYGBgCgojIyMgYFBUXzZRME5QVlAzYAoKVGhlIHNwZWNpbWVucyBmb3IgdGhpcyBwYXRpZW50LCBCU181Sk01NzNKQyBhbmQgQlNfRTVINkNGWVQsIHdlcmUgY2xhc3NpZmllZCBhcyBIR0FUIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgYSBoaXN0b25lIG11dGF0aW9uLCBidXQgd2l0aCB0aGUgcmVtb3ZhbCBvZiBMR0FUIGZyb20gdGhlIEhHQVQgbW9kdWxlLCB0aGlzIHNhbXBsZSB3aWxsIG5vIGxvbmdlciBzaG93IHVwIGluIHR3byBtb2R1bGVzLgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUXzZRME5QVlAzIikKYGBgCgojIyMgQXJlIHRoZXJlIGFueSBvdGhlciBkdXBsaWNhdGUgc3VidHlwZXM/CmBgYHtyfQp1bmlxdWVfc3VidHlwZXMgPC0gY29tcGlsZWRfZGYgJT4lCiAgc2VsZWN0KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHNhbXBsZV9pZCwgbW9sZWN1bGFyX3N1YnR5cGUpICU+JQogIGRpc3RpbmN0KCkKCnVuaXF1ZV9zdWJ0eXBlc1tkdXBsaWNhdGVkKHVuaXF1ZV9zdWJ0eXBlcyRzYW1wbGVfaWQpLF0KI1BUX0tUUko4VEZZIChmaXhlZCBpbiBjbGluaWNhbCBmZWVkYmFjaykgYW5kIFBUXzZRME5QVlAzIChmaXhlZCBpbiBIR0cgbW9kdWxlIHJlbW92aW5nIExHQVQpCmBgYAojIyMgYFBUXzAwRzAwN0RNYAo3MzE2LTI3MiBpcyBzdWJ0eXBlZCBhcyBFVE1SIGJlY2F1c2UgYSBDMTlNQyBhbHRlcmF0aW9uIHdhcyBmb3VuZCBhbmQgcGF0aG9sb2d5IHJldmlldyBjb25maXJtcyB0aGUgbmV3IGRpYWdub3NpcwoKYGBge3J9CmNvbXBpbGVkX2RmIDwtIGNvbXBpbGVkX2RmICU+JQogIG11dGF0ZShtb2xlY3VsYXJfc3VidHlwZT0gY2FzZV93aGVuKHNhbXBsZV9pZCA9PSAiNzMxNi0yNzIifiJFVE1SLCBDMTlNQy1hbHRlcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gbW9sZWN1bGFyX3N1YnR5cGUpLAogICAgICAgICBzaG9ydF9oaXN0b2xvZ3k9IGNhc2Vfd2hlbihzYW1wbGVfaWQgPT0gIjczMTYtMjcyIn4iRVRNUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IHNob3J0X2hpc3RvbG9neSksCiAgICAgICAgIGludGVncmF0ZWRfZGlhZ25vc2lzID0gY2FzZV93aGVuKHNhbXBsZV9pZCA9PSAiNzMxNi0yNzIifiJFbWJyeW9uYWwgdHVtb3Igd2l0aCBtdWx0aWxheWVyIHJvc2V0dGVzLCBDMTlNQy1hbHRlcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gaW50ZWdyYXRlZF9kaWFnbm9zaXMpLAogICAgICAgICBOb3RlcyA9IGNhc2Vfd2hlbihzYW1wbGVfaWQgPT0gIjczMTYtMjcyIiB+ICJVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmciLAogICAgICBUUlVFIH4gTm90ZXMKICAgICkKICApICU+JQogIHVuaXF1ZSgpCmBgYAoKVGhpcyBzYW1wbGUgaGFzIG11bHRpcGxlIHNwZWNpbWVucyB3aXRoIGRpZmZlcmVudCBkaWFnbm9zZXMgYW5kIHN1YnR5cGVzIGFuZCB0aGlzIGlzIGFjdHVhbGx5IGV4cGVjdGVkLCBhcyB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCBkaWFnbm9zZXMgaW4gdGhlIENCVE4gZGF0YWJhc2UgYW5kIHRoZSBDMTlNQyBhbHRlcmF0aW9uIHdhcyBvbmx5IGZvdW5kIGluIG9uZSBvZiB0aGUgc2FtcGxlcy4KYGBge3J9CmNvbXBpbGVkX2RmICU+JQogIGZpbHRlcihLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEID09ICJQVF8wMEcwMDdETSIpCmBgYAoKIyMjIGBQVF81QldaQTBOVGAKClRoaXMgc2FtcGxlIHdhcyBpbnNwZWN0ZWQgYnkgcGF0aG9sb2d5IGFuZCBzaG91bGQgYmUgYW5ub3RhdGVkIGFzIERNRywgSDMgSzI4LCBzbyBsZXQncyB1cGRhdGUgdGhhdC4KYGBge3J9CmNvbXBpbGVkX2RmICU+JQogIGZpbHRlcihLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEID09ICJQVF81QldaQTBOVCIpCmBgYAoKYGBge3J9CmNvbXBpbGVkX2RmIDwtIGNvbXBpbGVkX2RmICU+JQogIG11dGF0ZSgKICAgIGludGVncmF0ZWRfZGlhZ25vc2lzID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTEwMiIgfiAiRGlmZnVzZSBtaWRsaW5lIGdsaW9tYSwgSDMgSzI4LW11dGFudCIsCiAgICAgIFRSVUUgfiBpbnRlZ3JhdGVkX2RpYWdub3NpcwogICAgKSwKICAgIHNob3J0X2hpc3RvbG9neSA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTExMDIiIH4gIkhHQVQiLAogICAgICBUUlVFIH4gc2hvcnRfaGlzdG9sb2d5CiAgICApLAogICAgYnJvYWRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTEwMiIgfiAiRGlmZnVzZSBhc3Ryb2N5dGljIGFuZCBvbGlnb2RlbmRyb2dsaWFsIHR1bW9yIiwKICAgICAgVFJVRSB+IGJyb2FkX2hpc3RvbG9neQogICAgKSwKICAgIG1vbGVjdWxhcl9zdWJ0eXBlID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTEwMiIgfiAiRE1HLCBIMyBLMjgiLAogICAgICBUUlVFIH4gbW9sZWN1bGFyX3N1YnR5cGUKICAgICksCiAgICBOb3RlcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTExMDIiIH4gIlVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyIsCiAgICAgIFRSVUUgfiBOb3RlcwogICAgKQogICkKYGBgCgojIyMgYFBUXzgwTlZZQ0JTYAoKVGhpcyBzYW1wbGUgd2FzIGluc3BlY3RlZCBieSBwYXRob2xvZ3kgYW5kIHNob3VsZCBiZSBDTlMgSEdORVQtTU4xLCBzbyB3ZSB3aWxsIHVwZGF0ZSBoZXJlLgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUXzgwTlZZQ0JTIikKYGBgCmBgYHtyfQpjb21waWxlZF9kZiA8LSBjb21waWxlZF9kZiAlPiUKICBtdXRhdGUoCiAgICBpbnRlZ3JhdGVkX2RpYWdub3NpcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTc2NSIgfiAiQ05TIEVtYnJ5b25hbCBUdW1vciwgSEdORVQtTU4xIiwKICAgICAgVFJVRSB+IGludGVncmF0ZWRfZGlhZ25vc2lzCiAgICApLAogICAgc2hvcnRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtNzY1IiB+ICJFbWJyeW9uYWwgVHVtb3IiLAogICAgICBUUlVFIH4gc2hvcnRfaGlzdG9sb2d5CiAgICApLAogICAgYnJvYWRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtNzY1IiB+ICJFbWJyeW9uYWwgVHVtb3IiLAogICAgICBUUlVFIH4gYnJvYWRfaGlzdG9sb2d5CiAgICApLAogICAgbW9sZWN1bGFyX3N1YnR5cGUgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi03NjUiIH4gIkNOUyBIR05FVC1NTjEiLAogICAgICBUUlVFIH4gbW9sZWN1bGFyX3N1YnR5cGUKICAgICksCiAgICBOb3RlcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTc2NSIgfiAiVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nIiwKICAgICAgVFJVRSB+IE5vdGVzCiAgICApCiAgKQpgYGAKCiMjIyBgUFRfOUJaRVRNME1gCgpUaGlzIHNhbXBsZSB3YXMgaW5zcGVjdGVkIGJ5IHBhdGhvbG9neSBhbmQgc2hvdWxkIGJlIEhHRywgSDMgRzM1LCBzbyB3ZSB3aWxsIHVwZGF0ZSBoZXJlLgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUXzlCWkVUTTBNIikKYGBgCmBgYHtyfQpjb21waWxlZF9kZiA8LSBjb21waWxlZF9kZiAlPiUKICBtdXRhdGUoCiAgICBpbnRlZ3JhdGVkX2RpYWdub3NpcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTE1OCIgfiAiSGlnaC1ncmFkZSBnbGlvbWEvYXN0cm9jeXRvbWEsIEgzIEczNS1tdXRhbnQiLAogICAgICBUUlVFIH4gaW50ZWdyYXRlZF9kaWFnbm9zaXMKICAgICksCiAgICBzaG9ydF9oaXN0b2xvZ3kgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xNTgiIH4gIkhHQVQiLAogICAgICBUUlVFIH4gc2hvcnRfaGlzdG9sb2d5CiAgICApLAogICAgYnJvYWRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTU4IiB+ICJEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IiLAogICAgICBUUlVFIH4gYnJvYWRfaGlzdG9sb2d5CiAgICApLAogICAgbW9sZWN1bGFyX3N1YnR5cGUgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xNTgiIH4gIkhHRywgSDMgRzM1IiwKICAgICAgVFJVRSB+IG1vbGVjdWxhcl9zdWJ0eXBlCiAgICApLAogICAgTm90ZXMgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xNTgiIH4gIlVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyIsCiAgICAgIFRSVUUgfiBOb3RlcwogICAgKQogICkKYGBgCgojIyMgYFBUX0MyRDRKWFMxYAoKVGhpcyBzYW1wbGUgaGFzIG9uZSBiaW9zcGVjaW1lbiB3aGljaCBkaWQgbm90IGhhdmUgdGhlIEgzIHZhcmlhbnQgY2FwdHVyZWQgaW4gY29uc2Vuc3VzIGNhbGxzIC0gd2lsbCBpbnNwZWN0IHRoaXMgbGF0ZXIgYW5kIHBvc3NpYmx5IHdpbGwgYmUgZml4ZWQgd2l0aCBbIzgxOV0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvcHVsbC84NTQpLgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUX0MyRDRKWFMxIikKYGBgCgojIyMgYFBUX0VIRTgwMEpKYAoKVGhpcyBzYW1wbGUgaGFzIGEgaGFsbG1hcmsgRVdTUjEtRkxJMSBmdXNpb24sIHNvIGNvdWxkIGJlIHJlLWNsYXNzaWZpZWQgYXMgRVdTIG9uY2UgaXQgZ29lcyB0aHJvdWdoIHBhdGhvbG9neSByZXZpZXcuIEZvciBub3csIHdlIHdpbGwgY2hhbmdlIGl0IGhlcmUgdG8gRVdTLgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUX0VIRTgwMEpKIikKYGBgCmBgYHtyfQpjb21waWxlZF9kZiA8LSBjb21waWxlZF9kZiAlPiUKICBtdXRhdGUoCiAgICBpbnRlZ3JhdGVkX2RpYWdub3NpcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTIyOSIgfiAiRXdpbmcgc2FyY29tYSIsCiAgICAgIFRSVUUgfiBpbnRlZ3JhdGVkX2RpYWdub3NpcwogICAgKSwKICAgIHNob3J0X2hpc3RvbG9neSA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTIyOSIgfiAiRVdTIiwKICAgICAgVFJVRSB+IHNob3J0X2hpc3RvbG9neQogICAgKSwKICAgIGJyb2FkX2hpc3RvbG9neSA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTIyOSIgfiAiTWVzZW5jaHltYWwgbm9uLW1lbmluZ290aGVsaWFsIHR1bW9yIiwKICAgICAgVFJVRSB+IGJyb2FkX2hpc3RvbG9neQogICAgKSwKICAgIG1vbGVjdWxhcl9zdWJ0eXBlID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMjI5IiB+ICJFV1MiLAogICAgICBUUlVFIH4gbW9sZWN1bGFyX3N1YnR5cGUKICAgICksCiAgICBOb3RlcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTIyOSIgfiAiVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nIiwKICAgICAgVFJVRSB+IE5vdGVzCiAgICApCiAgKQpgYGAKCiMjIyBgUFRfS1RSSjhURllgCgpUaGlzIHNhbXBsZSBoYXMgb25lIGJpb3NwZWNpbWVuIHdoaWNoIGRpZCBub3QgaGF2ZSB0aGUgSDMgdmFyaWFudCBjYXB0dXJlZCBpbiBjb25zZW5zdXMgY2FsbHMuIEl0IGhhcyB0aGUgdmFyaWFudCBwcmVzZW50IG9ubHkgaW4gVmFyRGljdCBjYWxscyBhbmQgaW4gSUdWLCBhbmQgZXhwZWN0IHRoaXMgd2lsbCBiZSBmaXhlZCB3aXRoIFsjODE5XShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9wdWxsLzg1NCkuCmBgYHtyfQpjb21waWxlZF9kZiAlPiUKICBmaWx0ZXIoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfS1RSSjhURlkiKQpgYGAKCiMjIyBgUFRfWDY0OFJWTUtgCgpUaGlzIHNhbXBsZSB3YXMgcmV2aWV3ZWQgYnkgcGF0aG9sb2d5IGFuZCBjb25maXJtZWQgdG8gYmUgRVRNUiwgQzE5TUMtYWx0ZXJlZC4gV2lsbCBjaGFuZ2UgaGVyZS4KYGBge3J9CmNvbXBpbGVkX2RmICU+JQogIGZpbHRlcihLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEID09ICJQVF9YNjQ4UlZNSyIpCmBgYApgYGB7cn0KY29tcGlsZWRfZGYgPC0gY29tcGlsZWRfZGYgJT4lCiAgbXV0YXRlKAogICAgaW50ZWdyYXRlZF9kaWFnbm9zaXMgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0yMzgiIH4gIkVtYnJ5b25hbCB0dW1vciB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMsIEMxOU1DLWFsdGVyZWQiLAogICAgICBUUlVFIH4gaW50ZWdyYXRlZF9kaWFnbm9zaXMKICAgICksCiAgICBzaG9ydF9oaXN0b2xvZ3kgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0yMzgiIH4gIkVUTVIiLAogICAgICBUUlVFIH4gc2hvcnRfaGlzdG9sb2d5CiAgICApLAogICAgYnJvYWRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMjM4IiB+ICJFbWJyeW9uYWwgVHVtb3IiLAogICAgICBUUlVFIH4gYnJvYWRfaGlzdG9sb2d5CiAgICApLAogICAgbW9sZWN1bGFyX3N1YnR5cGUgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0yMzgiIH4gIkVUTVIsIEMxOU1DLWFsdGVyZWQiLAogICAgICBUUlVFIH4gbW9sZWN1bGFyX3N1YnR5cGUKICAgICksCiAgICBOb3RlcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTIzOCIgfiAiVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nIiwKICAgICAgVFJVRSB+IE5vdGVzCiAgICApCiAgKQpgYGAKCiMjIyBgUFRfWDcxRDdHNVNgCgpUaGlzIHNhbXBsZSB3YXMgcmV2aWV3ZWQgYnkgcGF0aG9sb2d5IGFuZCBjb25maXJtZWQgdG8gYmUgSDMgbXV0YW50LiBXaWxsIGNoYW5nZSBoZXJlLgpgYGB7cn0KY29tcGlsZWRfZGYgJT4lCiAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUX1g3MUQ3RzVTIikKYGBgCmBgYHtyfQpjb21waWxlZF9kZiA8LSBjb21waWxlZF9kZiAlPiUKICBtdXRhdGUoCiAgICBpbnRlZ3JhdGVkX2RpYWdub3NpcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTExMDUiIH4gIkhpZ2gtZ3JhZGUgZ2xpb21hL2FzdHJvY3l0b21hLCBIMyBHMzUtbXV0YW50IiwKICAgICAgVFJVRSB+IGludGVncmF0ZWRfZGlhZ25vc2lzCiAgICApLAogICAgc2hvcnRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTEwNSIgfiAiSEdBVCIsCiAgICAgIFRSVUUgfiBzaG9ydF9oaXN0b2xvZ3kKICAgICksCiAgICBicm9hZF9oaXN0b2xvZ3kgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xMTA1IiB+ICJEaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3IiLAogICAgICBUUlVFIH4gYnJvYWRfaGlzdG9sb2d5CiAgICApLAogICAgbW9sZWN1bGFyX3N1YnR5cGUgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xMTA1IiB+ICJIR0csIEgzIEczNSIsCiAgICAgIFRSVUUgfiBtb2xlY3VsYXJfc3VidHlwZQogICAgKSwKICAgIE5vdGVzID0gY2FzZV93aGVuKHNhbXBsZV9pZCA9PSAiNzMxNi0xMTA1IiB+ICJVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmciLAogICAgICBUUlVFIH4gTm90ZXMKICAgICkKICApCmBgYAoKIyMjIFdyaXRlIHJldmlzZWQgdGFibGUgdG8gZmlsZQoKYGBge3J9CiMgc29ydCBmaXJzdApjb21waWxlZF9kZiA8LSBjb21waWxlZF9kZiAlPiUgCiAgYXJyYW5nZShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCBzYW1wbGVfaWQpICU+JQogIGRpc3RpbmN0KCkgIyB0byByZW1vdmUgZHVwbGljYXRlcyBmcm9tIGFib3ZlCndyaXRlX3Rzdihjb21waWxlZF9kZiwgb3V0cHV0X2ZpbGUpCmBgYAoKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK
+
LS0tCnRpdGxlOiAiSW5jb3Jwb3JhdGluZyBDSE9QIHBhdGhvbG9neSBpbnB1dCB0byBtb2xlY3VsYXIgc3VidHlwaW5nIGNhbGxzIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQphdXRob3I6IEphY2x5biBUYXJvbmkgZm9yIEFMU0YgQ0NETApkYXRlOiAyMDIwCnBhcmFtczoKICBpc19jaTogRkFMU0UKLS0tCgpfQXV0aG9yc2hpcCBhYm92ZSByZWZlcnMgdG8gdGhpcyBub3RlYm9vayAqKm9ubHkqKi5fCgojIyBCYWNrZ3JvdW5kCgpBcyBwYXJ0IG9mIHRoaXMgcHJvamVjdCwgd2UgaGF2ZSB1bmRlcnRha2VuIHNldmVyYWwgYW5hbHlzZXMgdGhhdCB1c2UgbW9sZWN1bGFyIGRhdGEgdG8gc3VidHlwZSBvciByZWNsYXNzaWZ5IGJpb3NwZWNpbWVucy4gCkluIHNvbWUgY2FzZXMsIG91ciBhbmFseXNlcyBoYXZlIHJlc3VsdGVkIGluIGFuIHVwZGF0ZSBvZiB0aGUgYGludGVncmF0ZWRfZGlhZ25vc2lzYCBmaWVsZCBpbmNsdWRlZCBpbiB0aGUgY2xpbmljYWwgZmlsZSAoYHBidGEtaGlzdG9sb2dpZXMudHN2YCBbW2RvY10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvYmxvYi9tYXN0ZXIvZG9jL2RhdGEtZm9ybWF0cy5tZCNkYXRhLWNhdmVhdHMpXSkuCkhvd2V2ZXIsIG5vdCBhbGwgbG9naWMgaW5jbHVkZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlcG9zaXRvcnkgd2FzIHVsdGltYXRlbHkgaW4gYWdyZWVtZW50IHdpdGggZmVlZGJhY2sgZnJvbSBwYXRob2xvZ2lzdHMgYXQgQ0hPUC4KSW4gdGhpcyBub3RlYm9vaywgd2Ugd2lsbCBtYWtlIGNoYW5nZXMgYW5kIGRvY3VtZW50IHRoZSBjYXNlcyB3aGVyZSB0aGUgbG9naWMgaW4gdGhlIG1vZHVsZXMgb2YgdGhlIHJlcG9zaXRvcnkgZGV2aWF0ZSBmcm9tIHRoZSBmaW5hbCBsYWJlbHMuCgojIyBQYXRob2xvZ3kgRmVlZGJhY2sKCkhlcmUsIHdlJ3JlIGNvcHlpbmcgdGhlIHRhYmxlIGZyb20gWyM2MDYgKGNvbW1lbnQpXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvNjA5I2lzc3VlY29tbWVudC02MDI4MjEzNzYpIGhlcmU6Cgp8IEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQgfCBnbGlvbWFfYnJhaW5fcmVnaW9uIHwgc2FtcGxlX2lkIHwgYWxpcXVvdF9pZCB8IEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgfCBleHBlcmltZW50YWxfc3RyYXRlZ3kgfCBwYXRob2xvZ3lfZGlhZ25vc2lzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnRlZ3JhdGVkX2RpYWdub3NpcyAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgZnJvbSBQYXRoIGluc3BlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR2l2ZW4gdG8gUml0YSAzLzEzLzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNob3J0X2hpc3RvbG9neSB8IGJyb2FkX2hpc3RvbG9neSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJyb2FkX2NvbXBvc2l0aW9uIHwgTm90ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2FuY2VyX3ByZWRpc3Bvc2l0aW9ucyB8IG1vbGVjdWxhcl9zdWJ0eXBlICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IEJTX0M2WlozRlk1ICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0xMTA1IHwgNDcwMDE3ICAgICB8IFBUX1g3MUQ3RzVTICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBTdXByYXRlbnRvcmlhbCBvciBTcGluYWwgQ29yZCBQTkVUICAgICAgICAgICAgICAgfCBIaWdoLWdyYWRlIGdsaW9tYSAgICAgICAgICAgICAgICAgICAgICAgIHwgTm8gcGF0aCByZXBvcnQgYXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMSBzbGlkZSwgcGF0aG9sb2d5IHJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEhHRywgSDMgRzM1ICAgICAgICAgfAp8IEJTX1A4V044WEVRICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0xMTA1IHwgNTQ5NzEyICAgICB8IFBUX1g3MUQ3RzVTICAgICAgICAgICAgICAgfCBXR1MgICAgICAgICAgICAgICAgICAgfCBTdXByYXRlbnRvcmlhbCBvciBTcGluYWwgQ29yZCBQTkVUICAgICAgICAgICAgICAgfCBIaWdoLWdyYWRlIGdsaW9tYSAgICAgICAgICAgICAgICAgICAgICAgIHwgTm8gcGF0aCByZXBvcnQgYXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMSBzbGlkZSwgcGF0aG9sb2d5IHJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IEhHRywgSDMgRzM1ICAgICAgICAgfAp8IEJTXzIzTTcyQUJHICAgICAgICAgICAgICAgfCBOQSAgICAgICAgICAgICAgICAgIHwgNzMxNi01MjMgIHwgNTg4MzQzICAgICB8IFBUX0FRV0RRVzI3ICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBNZW5pbmdpb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA8L3M+RXBlbmR5bW9tYTwvcz4gTWVuaW5naW9tYSAgICAgICAgICAgICAgICAgICB8IE5vIHBhdGggcmVwb3J0IGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIGtlZXAgYXMgbWVuaW5naW9tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgc2xpZGVzLCBwYXRob2xvZ3kgcmVwb3J0OyBlbWFpbCByZXF1ZXN0IGZvciByYWRpb2xvZ3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgfCA8cz5FcGVuZHltYWwgdHVtb3I8L3M+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgPHM+U1QtRVBOLVlBUDwvcz4gICAgICAgICAgfAp8IEJTXzVKTTU3M0pDICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0yMjU1IHwgNzE3MTY2ICAgICB8IFBUXzZRME5QVlAzICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBHYW5nbGlvZ2xpb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEaWZmdXNlIG1pZGxpbmUgZ2xpb21hICAgICAgICAgICAgICAgICAgIHwgUGF0aCByZXBvcnQgZ2FuZ2xpb2dsaW9tYSB3aXRoIGV4dGVuc2l2ZSBjaG9uZHJvaWQgbWV0YXBsYXNpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5lZWQgdG8gcmV2aWV3IHJhZGlvbG9neSByZXBvcnQ7IGlmIG5vdCBkaWZmdXNlLCBnYW5nbGlvZ2xpb21hLCBIMyBtdXQgLSBjYW5ub3QgcmV2aWV3IHwgcGF0aG9sb2d5IHJlcG9ydCAobm8gc2xpZGVzIC0gZnJvbSBQaXR0KTsgZW1haWwgcmVxdWVzdCBmb3IgcmFkaW9sb2d5IC0gd2lsbCBub3QgcmVjZWl2ZSBpbiB0aGUgc2hvcnQgdGVybSB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IERNRywgSDMgSzI4ICAgICAgICAgfAp8IEJTX0U1SDZDRllUICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0yMjU1IHwgNzExMTM0ICAgICB8IFBUXzZRME5QVlAzICAgICAgICAgICAgICAgfCBXR1MgICAgICAgICAgICAgICAgICAgfCBHYW5nbGlvZ2xpb21hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEaWZmdXNlIG1pZGxpbmUgZ2xpb21hICAgICAgICAgICAgICAgICAgIHwgUGF0aCByZXBvcnQgZ2FuZ2xpb2dsaW9tYSB3aXRoIGV4dGVuc2l2ZSBjaG9uZHJvaWQgbWV0YXBsYXNpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5lZWQgdG8gcmV2aWV3IHJhZGlvbG9neSByZXBvcnQ7IGlmIG5vdCBkaWZmdXNlLCBnYW5nbGlvZ2xpb21hLCBIMyBtdXQgLSBjYW5ub3QgcmV2aWV3IHwgcGF0aG9sb2d5IHJlcG9ydCAobm8gc2xpZGVzIC0gZnJvbSBQaXR0KTsgZW1haWwgcmVxdWVzdCBmb3IgcmFkaW9sb2d5IC0gd2lsbCBub3QgcmVjZWl2ZSBpbiB0aGUgc2hvcnQgdGVybSB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IERNRywgSDMgSzI4ICAgICAgICAgfAp8IEJTX0JGREVaSzFDICAgICAgICAgICAgICAgfCBvdGhlciAgICAgICAgICAgICAgIHwgNzMxNi0xMTAyIHwgNTQ5NzE0ICAgICB8IFBUXzVCV1pBME5UICAgICAgICAgICAgICAgfCBXR1MgICAgICAgICAgICAgICAgICAgfCBTdXByYXRlbnRvcmlhbCBvciBTcGluYWwgQ29yZCBQTkVUICAgICAgICAgICAgICAgfCBEaWZmdXNlIG1pZGxpbmUgZ2xpb21hICAgICAgICAgICAgICAgICAgIHwgTm8gcGF0aCByZXBvcnQgYXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyBzbGlkZXMsIHBhdGhvbG9neSByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IERNRywgSDMgSzI4ICAgICAgICAgfAp8IEJTX01CN1dOMFpCICAgICAgICAgICAgICAgfCBvdGhlciAgICAgICAgICAgICAgIHwgNzMxNi0xMTAyIHwgNDcwMDMxICAgICB8IFBUXzVCV1pBME5UICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBTdXByYXRlbnRvcmlhbCBvciBTcGluYWwgQ29yZCBQTkVUICAgICAgICAgICAgICAgfCBEaWZmdXNlIG1pZGxpbmUgZ2xpb21hICAgICAgICAgICAgICAgICAgIHwgTm8gcGF0aCByZXBvcnQgYXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0gT0sgd2l0aCBuZXcgZHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyBzbGlkZXMsIHBhdGhvbG9neSByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IERpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IERNRywgSDMgSzI4ICAgICAgICAgfAp8IEJTX0gxWFBWUzlBICAgICAgICAgICAgICAgfCBoZW1pc3BoZXJpYyAgICAgICAgIHwgNzMxNi0xMTA2IHwgNTQ5NTc1ICAgICB8IFBUX1Q4VjlFUzkzICAgICAgICAgICAgICAgfCBSTkEtU2VxICAgICAgICAgICAgICAgfCBIaWdoLWdyYWRlIGdsaW9tYS9hc3Ryb2N5dG9tYSAoV0hPIGdyYWRlIElJSS9JVikgfCA8cz5IaWdoLWdyYWRlIGdsaW9tYTwvcz4gTG93LWdyYWRlIGdsaW9tYSAgICAgICB8IE5vIHBhdGggcmVwb3J0IGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXZpZXdlZCAtIE9LIHdpdGggbmV3IGR4IChQWEEvTEdHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgc2xpZGVzLCBwYXRob2xvZ3kgcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIR0FUICAgICAgICAgICAgfCA8cz5EaWZmdXNlIGFzdHJvY3l0aWMgYW5kIG9saWdvZGVuZHJvZ2xpYWwgdHVtb3I8L3M+IExvdy1ncmFkZSBhc3Ryb2N5dGljIHR1bW9yIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgTEdHLCBCUkFGIFY2MDBFICAgICAgICAgIHwKfCBCU19KNEU5U1c1MSAgICAgICAgICAgICAgIHwgaGVtaXNwaGVyaWMgICAgICAgICB8IDczMTYtMTEwNiB8IDU0OTcwOCAgICAgfCBQVF9UOFY5RVM5MyAgICAgICAgICAgICAgIHwgV0dTICAgICAgICAgICAgICAgICAgIHwgSGlnaC1ncmFkZSBnbGlvbWEvYXN0cm9jeXRvbWEgKFdITyBncmFkZSBJSUkvSVYpIHwgPHM+SGlnaC1ncmFkZSBnbGlvbWE8L3M+IExvdy1ncmFkZSBnbGlvbWEgICAgICAgfCBObyBwYXRoIHJlcG9ydCBhdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAoUFhBL0xHRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyIHNsaWRlcywgcGF0aG9sb2d5IHJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEdBVCAgICAgICAgICAgIHwgPHM+RGlmZnVzZSBhc3Ryb2N5dGljIGFuZCBvbGlnb2RlbmRyb2dsaWFsIHR1bW9yPC9zPiBMb3ctZ3JhZGUgYXN0cm9jeXRpYyB0dW1vciB8IHR1bW9yICAgICAgICAgICAgIHwgVXBkYXRlZCB2aWEgT3BlblBCVEEgc3VidHlwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSBkb2N1bWVudGVkICAgICAgICB8IExHRywgQlJBRiBWNjAwRSAgICAgICAgICB8CnwgQlNfSjhWWDREMTcgICAgICAgICAgICAgICB8IG1peGVkICAgICAgICAgICAgICAgfCA3MzE2LTUwNiAgfCA1ODgyOTkgICAgIHwgUFRfN0UzVjNKRlggICAgICAgICAgICAgICB8IFJOQS1TZXEgICAgICAgICAgICAgICB8IEVwZW5keW1vbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDxzPkRpZmZ1c2UgbWlkbGluZSBnbGlvbWE8L3M+IEVwZW5keW1vbWEgICAgICAgIHwgUGF0aCByZXBvcnQgcG9zdGVyaW9yIGZvc3NhIGVwZW5keW1vbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0ga2VlcCBFUE4gd2l0aCBIMyBtdXQtIHJhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IDxzPkRpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vcjwvcz4gRXBlbmR5bWFsIHR1bW9yICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCA8cz5ETUcsIEgzIEsyODwvcz4gICAgICAgICB8CnwgQlNfRzE2Tk01V0ogICAgICAgICAgICAgICB8IG1peGVkICAgICAgICAgICAgICAgfCA3MzE2LTUwNiAgfCA1ODgwMTEgICAgIHwgUFRfN0UzVjNKRlggICAgICAgICAgICAgICB8IFdHUyAgICAgICAgICAgICAgICAgICB8IEVwZW5keW1vbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDxzPkRpZmZ1c2UgbWlkbGluZSBnbGlvbWE8L3M+IEVwZW5keW1vbWEgICAgICAgIHwgUGF0aCByZXBvcnQgcG9zdGVyaW9yIGZvc3NhIGVwZW5keW1vbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldmlld2VkIC0ga2VlcCBFUE4gd2l0aCBIMyBtdXQtIHJhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhHQVQgICAgICAgICAgICB8IDxzPkRpZmZ1c2UgYXN0cm9jeXRpYyBhbmQgb2xpZ29kZW5kcm9nbGlhbCB0dW1vcjwvcz4gRXBlbmR5bWFsIHR1bW9yICAgICAgICAgICAgfCB0dW1vciAgICAgICAgICAgICB8IFVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgZG9jdW1lbnRlZCAgICAgICAgfCA8cz5ETUcsIEgzIEsyODwvcz4gICAgICAgICB8CnwgQlNfS1NLWjlKN0ogICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICAgICAgfCA3MzE2LTc2NSAgfCA0NzA3MzEgICAgIHwgUFRfODBOVllDQlMgICAgICAgICAgICAgICB8IFJOQS1TZXEgICAgICAgICAgICAgICB8IEVwZW5keW1vbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENOUyBFbWJyeW9uYWwgVHVtb3IgICAgICAgICAgICAgICAgICAgICAgfCBQYXRoIHJlcG9ydCBhbmFwbGFzdGljIGVwZW5keW1vbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRW1icnlvbmFsIFR1bW9yIHwgRW1icnlvbmFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgQ05TIEhHTkVULU1OMSAgICAgICB8CnwgQlNfSzA3S05URlkgICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICAgICAgfCA3MzE2LTI3MiAgfCA1ODgwMDEgICAgIHwgUFRfMDBHMDA3RE0gICAgICAgICAgICAgICB8IFdHUyAgICAgICAgICAgICAgICAgICB8IE1lZHVsbG9ibGFzdG9tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMgfCBQYXRoIHJlcG9ydCBoYWQgIm1lZHVsbG9ibGFzdG9tYSIgaGFuZHdyaXR0ZW4sIGJ1dCBmaW5hbCBkeCBFVE1SIHdpdGggbXVsdGlsYXllciByb3NldHRlcyAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVRNUiAgICAgICAgICAgIHwgRW1icnlvbmFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgRVRNUiwgQzE5TUMtYWx0ZXJlZCB8CnwgQlNfUVdOQlo5UkogICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICAgICAgfCA3MzE2LTI3MiAgfCA1ODgyODcgICAgIHwgUFRfMDBHMDA3RE0gICAgICAgICAgICAgICB8IFJOQS1TZXEgICAgICAgICAgICAgICB8IE1lZHVsbG9ibGFzdG9tYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMgfCBQYXRoIHJlcG9ydCBoYWQgIm1lZHVsbG9ibGFzdG9tYSIgaGFuZHdyaXR0ZW4sIGJ1dCBmaW5hbCBkeCBFVE1SIHdpdGggbXVsdGlsYXllciByb3NldHRlcyAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVRNUiAgICAgICAgICAgIHwgRW1icnlvbmFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgRVRNUiwgQzE5TUMtYWx0ZXJlZCB8CnwgQlNfUDM5U1FQVFMgICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICAgICAgfCA3MzE2LTQ0NyAgfCA1ODgzMDAgICAgIHwgUFRfMDFNWjYyS0cgICAgICAgICAgICAgICB8IFJOQS1TZXEgICAgICAgICAgICAgICB8IFBpbmVvYmxhc3RvbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMgfCBQYXRoIHJlcG9ydCBQTkVUL3BpbmVvYmxhc3RvbWE7ICJ0aGVyZSBhcmUgc2NhdHRlcmVkIHRydWUgcm9zZXR0ZXMgKEZsZXhuZXItV2ludGVyc3RlaW5lcikiIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVRNUiAgICAgICAgICAgIHwgRW1icnlvbmFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgRVRNUiwgQzE5TUMtYWx0ZXJlZCB8CnwgQlNfVEU4UUZGN1QgICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICAgICAgfCA3MzE2LTQ0NyAgfCA1ODgwMTIgICAgIHwgUFRfMDFNWjYyS0cgICAgICAgICAgICAgICB8IFdHUyAgICAgICAgICAgICAgICAgICB8IFBpbmVvYmxhc3RvbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVtYnJ5b25hbCB0dW1vciB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMgfCBQYXRoIHJlcG9ydCBQTkVUL3BpbmVvYmxhc3RvbWE7ICJ0aGVyZSBhcmUgc2NhdHRlcmVkIHRydWUgcm9zZXR0ZXMgKEZsZXhuZXItV2ludGVyc3RlaW5lcikiIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVRNUiAgICAgICAgICAgIHwgRW1icnlvbmFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgRVRNUiwgQzE5TUMtYWx0ZXJlZCB8CnwgQlNfTjZOMTQ3QlkgICAgICAgICAgICAgICB8IE5BICAgICAgICAgICAgICAgICAgfCA3MzE2LTIzOCAgfCAyMzIwOTYgICAgIHwgUFRfWDY0OFJWTUsgICAgICAgICAgICAgICB8IFJOQS1TZXEgICAgICAgICAgICAgICB8IEhpZ2gtZ3JhZGUgZ2xpb21hL2FzdHJvY3l0b21hIChXSE8gZ3JhZGUgSUlJL0lWKSB8IEVtYnJ5b25hbCB0dW1vciB3aXRoIG11bHRpbGF5ZXIgcm9zZXR0ZXMgfCBQYXRoIHJlcG9ydCBoYW5kd3JpdHRlbiAiaGlnaCBncmFkZSBnbGlvbWEiOyBmaW5hbCBkeCBpbmZpbHRyYXRpbmcgZ2xpb25ldXJvbmFsIG5lb3BsYXNtICAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCAoRVRNUiBvcmlnaW5hbCB0dW1vciA3MzE2LTI5NzUgYW5kIHRoaXMgb25lIGNvbnNpc3RlbnQpICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVRNUiAgICAgICAgICAgIHwgRW1icnlvbmFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgRVRNUiwgQzE5TUMtYWx0ZXJlZCB8CnwgQlNfNVAxVE4xMFogICAgICAgICAgICAgICB8IGhlbWlzcGhlcmljICAgICAgICAgfCA3MzE2LTE1OCAgfCA3NDYwNjEgICAgIHwgUFRfOUJaRVRNME0gICAgICAgICAgICAgICB8IFJOQS1TZXEgICAgICAgICAgICAgICB8IFN1cHJhdGVudG9yaWFsIG9yIFNwaW5hbCBDb3JkIFBORVQgICAgICAgICAgICAgICB8IEhpZ2gtZ3JhZGUgZ2xpb21hICAgICAgICAgICAgICAgICAgICAgICAgfCBQYXRoIHJlcG9ydCBQTkVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCBncmFkZSBJSUktSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEdBVCAgICAgICAgICAgIHwgRGlmZnVzZSBhc3Ryb2N5dGljIGFuZCBvbGlnb2RlbmRyb2dsaWFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBmcm9tIFBORVQgdG8gSEdHIGR1ZSB0byBIM0YzQSBtdXRhdGlvbjtVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgSEdHLCBIMyBHMzUgICAgICAgICB8CnwgQlNfU1ROSDdZU1ggICAgICAgICAgICAgICB8IGhlbWlzcGhlcmljICAgICAgICAgfCA3MzE2LTE1OCAgfCA3NDYwNTYgICAgIHwgUFRfOUJaRVRNME0gICAgICAgICAgICAgICB8IFdHUyAgICAgICAgICAgICAgICAgICB8IFN1cHJhdGVudG9yaWFsIG9yIFNwaW5hbCBDb3JkIFBORVQgICAgICAgICAgICAgICB8IEhpZ2gtZ3JhZGUgZ2xpb21hICAgICAgICAgICAgICAgICAgICAgICAgfCBQYXRoIHJlcG9ydCBQTkVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCBncmFkZSBJSUktSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEdBVCAgICAgICAgICAgIHwgRGlmZnVzZSBhc3Ryb2N5dGljIGFuZCBvbGlnb2RlbmRyb2dsaWFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBmcm9tIFBORVQgdG8gSEdHIGR1ZSB0byBIM0YzQSBtdXRhdGlvbjtVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgSEdHLCBIMyBHMzUgICAgICAgICB8CnwgQlNfVFY1Qjg2WkQgICAgICAgICAgICAgICB8IGhlbWlzcGhlcmljICAgICAgICAgfCA3MzE2LTE1OCAgfCAxNTA1OTMgICAgIHwgUFRfOUJaRVRNME0gICAgICAgICAgICAgICB8IFJOQS1TZXEgICAgICAgICAgICAgICB8IFN1cHJhdGVudG9yaWFsIG9yIFNwaW5hbCBDb3JkIFBORVQgICAgICAgICAgICAgICB8IEhpZ2gtZ3JhZGUgZ2xpb21hICAgICAgICAgICAgICAgICAgICAgICAgfCBQYXRoIHJlcG9ydCBQTkVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV2aWV3ZWQgLSBPSyB3aXRoIG5ldyBkeCBncmFkZSBJSUktSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEdBVCAgICAgICAgICAgIHwgRGlmZnVzZSBhc3Ryb2N5dGljIGFuZCBvbGlnb2RlbmRyb2dsaWFsIHR1bW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHVtb3IgICAgICAgICAgICAgfCBmcm9tIFBORVQgdG8gSEdHIGR1ZSB0byBIM0YzQSBtdXRhdGlvbjtVcGRhdGVkIHZpYSBPcGVuUEJUQSBzdWJ0eXBpbmcgfCBOb25lIGRvY3VtZW50ZWQgICAgICAgIHwgSEdHLCBIMyBHMzUgICAgICAgICB8CgpBbmQgdGhlIG5vdGVzOgoKPiAjIyMjIEZldyBub3RlczoKPiAxLiBgUFRfN0UzVjNKRlhgIHNwZWNpbWVucyB3ZXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3JpZ2luYWwgRVBOIGR4LCBzbyBwYXRob2xvZ3kgd291bGQgY2FsbCB0aGlzIGEgcmFyZSBFUE4sIEgzIEsyOCBtdXRhdGVkIHR1bW9yLCByYXRoZXIgdGhhbiBETUcuCj4gMi4gYFBUX0FRV0RRVzI3YCBzcGVjaW1lbiB3YXMgY29uc2lzdGVudCB3aXRoIG1lbmluZ2lvbWEsIGV2ZW4gdGhvdWdoIGl0IGhhcyBhIGhhbGxtYXJrIEVQTiBmdXNpb24sIHNvIHBhdGhvbG9neSB3b3VsZCBhbHNvIGNhbGwgdGhpcyBhIHJhcmUgbWVuaW5naW9tYSB3aXRoIGEgX1lBUDFfIGZ1c2lvbi4KPiAzLiBCZWNhdXNlIDEgaXMgYSByYXJlIHR1bW9yIChtYXliZSBmaXJzdCBzZWVuKSwgdGhlIGxvZ2ljIG9mIHNlYXJjaGluZyBmb3IgYWxsIEgzIEsyOCBtdXRhdGlvbnMgaW4gW0hHRyBzdWJ0eXBpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8yNDkpIHdvdWxkIGNvbnZlcnQgdGhpcyBzYW1wbGUgYnkgZGVmYXVsdCAtIGhvdyB0byBoYW5kbGUgdGhpcz8gCj4gIDQuIFBhdGhvbG9neSBjb25maXJtZWQgdGhpcyBIR0cgQlJBRiBWNjAwRSBtdXRhbnQgdHVtb3IsIFtgQlNfSDFYUFZTOUFgXShodHRwczovL2NiZXRoZWxsLmdpdGh1Yi5pby9vcGVuLXBidGEtb3V0cHV0LzA5LUhHRy13aXRoLWJyYWYtY2x1c3RlcmluZy5uYi5odG1sI2lkZW50aWZ5X3NhbXBsZV90aGF0X2NsdXN0ZXJzX3dpdGhfbGdhdCksIHRvIGJlIGEgTEdBVCAoUFhBKS4gSSB1cGRhdGVkIGBtb2xlY3VsYXJfc3VidHlwZWAgaGVyZSBiYXNlZCBvbiB3aGF0IGl0IHdvdWxkIGxvb2sgbGlrZSwgYnV0IHRoaXMgc2hvdWxkIGNvbWUgdGhyb3VnaCB2aWEgdGhlIExHQVQgW3N1YnR5cGluZ10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzYzMSkgdGlja2V0LiBIb3cgc2hvdWxkIHdlIGFkZCB0aGlzIGluZm8/CgojIyBTZXQgdXAgCgpgYGB7cn0KIyBUaGlzIGxvZ2ljIGlzIHRoZSBzYW1lIGFzIGFuYWx5c2VzL2dlbmUtc2V0LWVucmljaG1lbnQtYW5hbHlzaXMvMDItbW9kZWwtZ3NlYS5SbWQKIyBBc3NpZ25pbmcgcGFyYW1zJGlzX2NpIHRvIHJ1bm5pbmdfaW5fY2kgYXZvaWRzIGEgbG9ja2VkIGJpbmRpbmcgZXJyb3IKcnVubmluZ19pbl9jaSA8LSBwYXJhbXMkaXNfY2kKCiMgQXJlIHdlIHRlc3Rpbmc/IEluIGNhc2Ugb2YgYSBub24gMC8xIG51bWJlciwgd2UgcmVjYXN0IGFzIGxvZ2ljYWwsIGFuZCB0aGVuIAojIGVuc3VyZSBsb2dpY2FsLgppZiAocnVubmluZ19pbl9jaSAlaW4lIGMoMCwxKSkgcnVubmluZ19pbl9jaSA8LSBhcy5sb2dpY2FsKHJ1bm5pbmdfaW5fY2kpCmlmICghKGlzLmxvZ2ljYWwocnVubmluZ19pbl9jaSkpKQp7CiAgc3RvcCgiXG5cbkVSUk9SOiBUaGUgcGFyYW1ldGVyIGBpc19jaWAgc2hvdWxkIGJlIEZBTFNFL1RSVUUgKG9yIDAvMSkuIikKfQpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCiMjIyBEaXJlY3RvcnkgYW5kIGZpbGVzCgojIyMjIERpcmVjdG9yaWVzCgpgYGB7cn0Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCmRhdGFfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgImRhdGEiKQpyZXN1bHRzX2RpciA8LSAicmVzdWx0cyIKYGBgCgojIyMjIElucHV0CgpXaGVuIHdlIHJ1biB0aGlzIGxvY2FsbHksIHdlIHdhbnQgdG8gdGllIGl0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgaGlzdG9sb2dpZXMgZmlsZSBfcHJpb3JfIHRvIGZlZWRiYWNrIHdlIHJlY2VpdmVkIGZyb20gcGF0aG9sb2d5IHRoYXQgaXMgcmVjb3JkZWQgb24gWyM2MDldKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy82MDkpLgoKYGBge3J9CmlmIChydW5uaW5nX2luX2NpKSB7CiAgaGlzdG9sb2dpZXNfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJwYnRhLWhpc3RvbG9naWVzLnRzdiIpCn0gZWxzZSB7CiAgaGlzdG9sb2dpZXNfZmlsZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICJyZWxlYXNlLXYxNS0yMDIwMDIyOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBidGEtaGlzdG9sb2dpZXMudHN2IikKfQpgYGAKCmBgYHtyfQpjb21waWxlZF9yZXN1bHRzX2ZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZWRfbW9sZWN1bGFyX3N1YnR5cGVzX3dpdGhfY2xpbmljYWxfZmVlZGJhY2sudHN2IikKZnVzaW9uc19maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAicGJ0YS1mdXNpb24tcHV0YXRpdmUtb25jb2dlbmljLnRzdiIpCmBgYAoKIyMjIyBPdXRwdXQKCmBgYHtyfQpvdXRwdXRfZmlsZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGlsZWRfbW9sZWN1bGFyX3N1YnR5cGVzX3dpdGhfY2xpbmljYWxfcGF0aG9sb2d5X2ZlZWRiYWNrLnRzdiIpCmBgYAoKIyMgUmVhZCBpbiBkYXRhCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpoaXN0b2xvZ2llc19kZiA8LSByZWFkX3RzdihoaXN0b2xvZ2llc19maWxlLCBndWVzc19tYXggPSAxMDAwMCkKY29tcGlsZWRfZGYgPC0gcmVhZF90c3YoY29tcGlsZWRfcmVzdWx0c19maWxlKQpmdXNpb25zX2RmIDwtIHJlYWRfdHN2KGZ1c2lvbnNfZmlsZSkKYGBgCgojIyBSZXZpc2Ugc3VidHlwaW5nIGNhbGxzIGJhc2VkIG9uIHBhdGhvbG9neSBmZWVkYmFjawoKIyMjIGBQVF83RTNWM0pGWGAKCmBQVF83RTNWM0pGWGAgd2FzIGNsYXNzaWZpZWQgaW4gYG1vbGVjdWxhci1zdWJ0eXBpbmctSEdHYCBhcyBgRE1HLCBIMyBLMjhgIGJlY2F1c2UgdGhlIGZpcnN0IHN0ZXAgaW4gdGhhdCBtb2R1bGUgd2FzIHRvIGlkZW50aWZ5IGFueSBzYW1wbGVzIGluIHRoZSBjb2hvcnQgd2l0aCAiZGVmaW5pbmcgbGVzaW9uczoiIEgzIEsyOCBvciBIMyBHMzUgKG9yaWdpbmFsIHN1YnR5cGluZyBpc3N1ZTogWyMyNDldKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8yNDkpKS4KCmBgYHtyfQpjb21waWxlZF9kZiAlPiUKICBmaWx0ZXIoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfN0UzVjNKRlgiKQpgYGAKClRoZSByZWxldmFudCBub3RlcyBhYm92ZSBhcmUKCj4gMS4gYFBUXzdFM1YzSkZYYCBzcGVjaW1lbnMgd2VyZSBjb25zaXN0ZW50IHdpdGggdGhlIG9yaWdpbmFsIEVQTiBkeCwgc28gcGF0aG9sb2d5IHdvdWxkIGNhbGwgdGhpcyBhIHJhcmUgRVBOLCBIMyBLMjggbXV0YXRlZCB0dW1vciwgcmF0aGVyIHRoYW4gRE1HLgo+IDMuIEJlY2F1c2UgMSBpcyBhIHJhcmUgdHVtb3IgKG1heWJlIGZpcnN0IHNlZW4pLCB0aGUgbG9naWMgb2Ygc2VhcmNoaW5nIGZvciBhbGwgSDMgSzI4IG11dGF0aW9ucyBpbiBbSEdHIHN1YnR5cGluZ10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzI0OSkgd291bGQgY29udmVydCB0aGlzIHNhbXBsZSBieSBkZWZhdWx0IC0gaG93IHRvIGhhbmRsZSB0aGlzPyAKClNvIHdlIHdpbGwgcmV2aXNlIHRoZSBgbW9sZWN1bGFyX3N1YnR5cGVgLCBgaW50ZWdyYXRlZF9kaWFnbm9zaXNgLCBgc2hvcnRfaGlzdG9sb2d5YCwgYW5kIGBicm9hZF9oaXN0b2xvZ3lgIGFjY29yZGluZ2x5LgoKYGBge3J9CmNvbXBpbGVkX2RmIDwtIGNvbXBpbGVkX2RmICU+JQogIG11dGF0ZSgKICAgIGludGVncmF0ZWRfZGlhZ25vc2lzID0gY2FzZV93aGVuKAogICAgICBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEID09ICJQVF83RTNWM0pGWCIgfiAiRXBlbmR5bW9tYSIsCiAgICAgIFRSVUUgfiBpbnRlZ3JhdGVkX2RpYWdub3NpcyAKICAgICksCiAgICBzaG9ydF9oaXN0b2xvZ3kgPSBjYXNlX3doZW4oCiAgICAgIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gIlBUXzdFM1YzSkZYIiB+ICJFcGVuZHltb21hIiwKICAgICAgVFJVRSB+IHNob3J0X2hpc3RvbG9neQogICAgKSwKICAgIGJyb2FkX2hpc3RvbG9neSA9IGNhc2Vfd2hlbigKICAgICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfN0UzVjNKRlgiIH4gIkVwZW5keW1hbCB0dW1vciIsCiAgICAgIFRSVUUgfiBicm9hZF9oaXN0b2xvZ3kKICAgICksCiAgICBtb2xlY3VsYXJfc3VidHlwZSA9IGNhc2Vfd2hlbigKICAgICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCA9PSAiUFRfN0UzVjNKRlgiIH4gIkVQTiwgSDMgSzI4IiwKICAgICAgVFJVRSB+IG1vbGVjdWxhcl9zdWJ0eXBlCiAgICApCiAgKQpgYGAKCiMjIyBgQlNfSDFYUFZTOUFgCgpgQlNfSDFYUFZTOUFgIGlzIGZyb20gYSBzYW1wbGUgd2l0aCBhIEJSQUYgVjYwMEUgbXV0YXRpb24gdGhhdCBpcyBIMyB3aWxkdHlwZS4KVGhpcyBzYW1wbGUgd2FzIG9yaWdpbmFsbHkgbGFiZWxlZCBhcyBhIEhHRy4KSW4gbG93LWRpbWVuc2lvbmFsIHRyYW5zY3JpcHRvbWljIHNwYWNlIChlLmcuLCBVTUFQLCB0LVNORSksIGBCU19IMVhQVlM5QWAgY2x1c3RlcnMgd2l0aCBMR0cgc2FtcGxlcy4KKFNlZSBgbW9sZWN1bGFyLXN1YnR5cGluZy1IR0dgLikKClRoZSByZWxldmFudCBub3RlIGZyb20gYWJvdmU6Cgo+ICA0LiBQYXRob2xvZ3kgY29uZmlybWVkIHRoaXMgSEdHIEJSQUYgVjYwMEUgbXV0YW50IHR1bW9yLCBgQlNfSDFYUFZTOUFgCnRvIGJlIGEgTEdBVCAoUFhBKS4gSSB1cGRhdGVkIGBtb2xlY3VsYXJfc3VidHlwZWAgaGVyZSBiYXNlZCBvbiB3aGF0IGl0IHdvdWxkIGxvb2sgbGlrZSwgYnV0IHRoaXMgc2hvdWxkIGNvbWUgdGhyb3VnaCB2aWEgdGhlIExHQVQgW3N1YnR5cGluZ10oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzYzMSkgdGlja2V0LiBIb3cgc2hvdWxkIHdlIGFkZCB0aGlzIGluZm8/CgpUaGUgc3RlcHMgZm9yIExHQVQgc3VidHlwaW5nIGFyZSB0byBjbGFzc2lmeSBMR0cgc2FtcGxlcyBvbiB0aGUgYmFzaXMgb2YgdGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgX0JSQUZfIGZ1c2lvbnMgYW5kIEJSQUYgVjYwMEUgbXV0YXRpb25zLgoKYGBge3J9CmNvbXBpbGVkX2RmICU+JQogIGZpbHRlcihLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEID09ICJCU19IMVhQVlM5QSIpICU+JQogIHNlbGVjdChLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCBzYW1wbGVfaWQpICU+JQogIGxlZnRfam9pbihjb21waWxlZF9kZikKYGBgCgpXZSBrbm93IGZyb20gYG1vbGVjdWxhci1zdWJ0eXBpbmctSEdHYCB0aGF0IGEgQlJBRiBWNjAwRSBtdXRhdGlvbiBpcyBwcmVzZW50LgpOb3cgd2UgaGF2ZSB0byBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIF9CUkFGXyBmdXNpb25zLgoKYGBge3J9CmZ1c2lvbnNfZGYgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QoRnVzaW9uTmFtZSwgIkJSQUYiKSwKICAgICAgICAgU2FtcGxlID09ICJCU19IMVhQVlM5QSIpCmBgYAoKVGhlcmUgYXJlIG5vIF9CUkFGXyBmdXNpb25zIGluIGBCU19IMVhQVlM5QWAsIHNvIHdlIGFyZSBhYmxlIHRvIGNsYXNzaWZ5IHRoaXMgc2FtcGxlIChgNzMxNi0xMTA2YCkgYXMgYExHRywgQlJBRiBWNjAwRWAuCgpgYGB7cn0KY29tcGlsZWRfZGYgPC0gY29tcGlsZWRfZGYgJT4lCiAgbXV0YXRlKAogICAgaW50ZWdyYXRlZF9kaWFnbm9zaXMgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xMTA2IiB+ICJMb3ctZ3JhZGUgYXN0cm9jeXRpYyB0dW1vciIsCiAgICAgIFRSVUUgfiBpbnRlZ3JhdGVkX2RpYWdub3NpcwogICAgKSwKICAgIHNob3J0X2hpc3RvbG9neSA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTExMDYiIH4gIkxHQVQiLAogICAgICBUUlVFIH4gc2hvcnRfaGlzdG9sb2d5CiAgICApLAogICAgYnJvYWRfaGlzdG9sb2d5ID0gY2FzZV93aGVuKAogICAgICBzYW1wbGVfaWQgPT0gIjczMTYtMTEwNiIgfiAiTG93LWdyYWRlIGFzdHJvY3l0aWMgdHVtb3IiLAogICAgICBUUlVFIH4gYnJvYWRfaGlzdG9sb2d5CiAgICApLAogICAgbW9sZWN1bGFyX3N1YnR5cGUgPSBjYXNlX3doZW4oCiAgICAgIHNhbXBsZV9pZCA9PSAiNzMxNi0xMTA2IiB+ICJMR0csIEJSQUYgVjYwMEUiLAogICAgICBUUlVFIH4gbW9sZWN1bGFyX3N1YnR5cGUKICAgICksCiAgICBOb3RlcyA9IGNhc2Vfd2hlbigKICAgICAgc2FtcGxlX2lkID09ICI3MzE2LTExMDYiIH4gIlVwZGF0ZWQgdmlhIE9wZW5QQlRBIHN1YnR5cGluZyIsCiAgICAgIFRSVUUgfiBOb3RlcwogICAgKQogICkKYGBgCgojIyMgSEdHIEJSQUYgVjYwMEUKClRoZSBmb2xsb3cgcG9pbnQgY29tZXMgZnJvbSBhbm90aGVyIGlzc3VlIFsjNjI3IChjb21tZW50KV0oaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvaXNzdWVzLzYyNyNpc3N1ZWNvbW1lbnQtNTk4Nzg5MjMyKToKCj4gV2UgaGF2ZSBhIHN0YW5kYWxvbmUgQlJBRiBWNjAwRSBzdWJ0eXBlLCBidXQgdGhpcyBpcyBIR0cgb25seSwgYW5kIHNob3VsZCBiZSBsYWJlbGVkIGFzIHN1Y2ggKHdpbGwgY3JlYXRlIGFuIHVwZGF0ZSBIR0cgYW5hbHlzaXMgdGlja2V0KS4KCmBgYHtyfQpjb21waWxlZF9kZiAlPiUKICBmaWx0ZXIobW9sZWN1bGFyX3N1YnR5cGUgPT0gIkJSQUYgVjYwMEUiKQpgYGAKCk5vdyB0aGF0IHdlIGhhdmUgYWRkcmVzc2VkIHRoZSBvbmUgc2FtcGxlIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiByZWNsYXNzaWZpZWQgYXMgTEdHLCB3ZSBhcmUgYWJsZSB0byB1cGRhdGUgYG1vbGVjdWxhcl9zdWJ0eXBlYCB0byBgSEdHLCBCUkFGIFY2MDBFYCBmb3IgdGhlIHJlbWFpbmluZyBzYW1wbGVzLgoKYGBge3J9CmNvbXBpbGVkX2RmIDwtIGNvbXBpbGVkX2RmICU+JQogIG11dGF0ZShtb2xlY3VsYXJfc3VidHlwZSA9IGNhc2Vfd2hlbigKICAgIG1vbGVjdWxhcl9zdWJ0eXBlID09ICJCUkFGIFY2MDBFIiB+ICJIR0csIEJSQUYgVjYwMEUiLAogICAgVFJVRSB+IG1vbGVjdWxhcl9zdWJ0eXBlCiAgKSkKYGBgCgojIyMgYFBUX0FRV0RRVzI3YAoKPiAyLiBgUFRfQVFXRFFXMjdgIHNwZWNpbWVuIHdhcyBjb25zaXN0ZW50IHdpdGggbWVuaW5naW9tYSwgZXZlbiB0aG91Z2ggaXQgaGFzIGEgaGFsbG1hcmsgRVBOIGZ1c2lvbiwgc28gcGF0aG9sb2d5IHdvdWxkIGFsc28gY2FsbCB0aGlzIGEgcmFyZSBtZW5pbmdpb21hIHdpdGggYSBfWUFQMV8gZnVzaW9uLgoKVGhlIGBtb2xlY3VsYXItc3VidHlwaW5nLUVQTmAgbW9kdWxlIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgeWV0LCBidXQgdGhlIGxvZ2ljIHRoYXQgaXMgaW4gdGhhdCBtb2R1bGUgbWF5IG1lYW4gdGhhdCB3ZSBuZWVkIHRvIGluY2x1ZGUgcmV2aXNpbmcgdGhlIGxhYmVscyBvZiBgUFRfQVFXRFFXMjdgLgoKYGBgCiMgVE9ETzogZG8gd2UgbmVlZCB0byB1cGRhdGUgUFRfQVFXRFFXMjcgb25jZSBtb2xlY3VsYXItc3VidHlwaW5nLUVQTiBpcyAKIyBjb21wbGV0ZT8KYGBgCgojIyMgV3JpdGUgcmV2aXNlZCB0YWJsZSB0byBmaWxlCgpgYGB7cn0KIyBzb3J0IGZpcnN0CmNvbXBpbGVkX2RmIDwtIGNvbXBpbGVkX2RmICU+JSAKICBhcnJhbmdlKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHNhbXBsZV9pZCkKd3JpdGVfdHN2KGNvbXBpbGVkX2RmLCBvdXRwdXRfZmlsZSkKYGBgCgojIyBTZXNzaW9uIEluZm8KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoK
@@ -4152,6 +1117,55 @@

Session Info

+ + + + + + + + +