@datagrok/eda 1.1.21 → 1.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@datagrok/eda",
3
3
  "friendlyName": "EDA",
4
- "version": "1.1.21",
4
+ "version": "1.1.22",
5
5
  "description": "Exploratory Data Analysis Tools",
6
6
  "dependencies": {
7
- "@datagrok-libraries/math": "^1.1.3",
8
- "@datagrok-libraries/ml": "^6.6.4",
7
+ "@datagrok-libraries/math": "^1.1.5",
8
+ "@datagrok-libraries/ml": "^6.6.5",
9
9
  "@datagrok-libraries/tutorials": "^1.3.6",
10
10
  "@datagrok-libraries/utils": "^4.1.44",
11
11
  "@keckelt/tsne": "^1.0.2",
package/dist/246.js DELETED
@@ -1,2 +0,0 @@
1
- var eda;(()=>{"use strict";var n,e,t={8960:(n,e,t)=>{var r;!function(n){n.EUCLIDEAN="EUCLIDEAN",n.MANHATTAN="MANHATTAN"}(r||(r={}));const a={[r.EUCLIDEAN]:function(n){return`\n var sum = 0.0;\n for (var i = 0u; i < ${n}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[r.MANHATTAN]:function(n){return`\n var sum = 0.0;\n for (var i = 0u; i < ${n}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var i;!function(n){n.HAMMING="Hamming",n.EUCLIDEAN="Euclidean",n.MANHATTAN="Manhattan",n.TANIMOTO="Tanimoto",n.LEVENSTEIN="Levenshtein",n.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",n.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",n.SOKAL="Sokal",n.COSINE="Cosine",n.ASYMMETRIC="Asymmetric",n.Difference="Difference",n.OneHot="One-Hot"}(i||(i={}));const o={[i.HAMMING]:function(n,e){return`\n let aLength: u32 = computeInfo.entrySizes[${e}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${e}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${n}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${n};\n `},[i.EUCLIDEAN]:function(n,e){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${n}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[i.MANHATTAN]:function(n,e){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${n}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[i.TANIMOTO]:function(n,e){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[i.LEVENSTEIN]:function(n,e){return`\n let aLength: u32 = computeInfo.entrySizes[${e}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${e}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${n+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[i.NEEDLEMAN_WUNSCH]:function(n,e){return`\n let aLength: u32 = computeInfo.entrySizes[${e}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${e}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${n+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${n+1}u>;\n var horizontalGaps: array<u32, ${n+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${e};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${e};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${e}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `},[i.MONOMER_CHEMICAL_DISTANCE]:function(n,e){return`\n let aLength: u32 = computeInfo.entrySizes[${e}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${e}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${e}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${n}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${n};\n `},[i.SOKAL]:function(n,e){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[i.COSINE]:function(n,e){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[i.ASYMMETRIC]:function(n,e){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${n}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[i.Difference]:function(n,e){return`\n let range = suppInfo.range${e};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[i.OneHot]:function(n,e){return`\n let aLength: u32 = computeInfo.entrySizes[${e}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${e}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},s={[i.HAMMING]:n=>Math.ceil(n/30),[i.EUCLIDEAN]:n=>Math.ceil(n/30),[i.MANHATTAN]:n=>Math.ceil(n/30),[i.TANIMOTO]:n=>Math.ceil(n/60),[i.SOKAL]:n=>Math.ceil(n/60),[i.COSINE]:n=>Math.ceil(n/60),[i.ASYMMETRIC]:n=>Math.ceil(n/60),[i.LEVENSTEIN]:n=>Math.ceil(n*n/60),[i.NEEDLEMAN_WUNSCH]:n=>Math.ceil(n*n/60),[i.MONOMER_CHEMICAL_DISTANCE]:n=>Math.ceil(n/25),[i.Difference]:n=>1,[i.OneHot]:n=>Math.ceil(n/40)},u={STRING:new Set([i.HAMMING,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.MONOMER_CHEMICAL_DISTANCE,i.OneHot]),UINT32ARRAY:new Set([i.HAMMING,i.EUCLIDEAN,i.MANHATTAN,i.MONOMER_CHEMICAL_DISTANCE,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC,i.OneHot,i.Difference]),INT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.OneHot,i.Difference]),FLOAT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),NUMBER:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),BITARRAY:new Set([i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC])};let l=null,c=null;function f(n,e=.8,t,a,o,f){return d=this,p=void 0,g=function*(){const d=yield function(){return n=this,e=void 0,r=function*(){if(!l&&(l=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==l))return null;let n=!1;if(c&&(c.lost.then((()=>{n=!0})),yield new Promise((n=>setTimeout(n,10)))),!c||n){const n=1e9,e=l.limits,t=e.maxBufferSize,r=e.maxStorageBufferBindingSize;try{return c=yield l.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,n),maxStorageBufferBindingSize:Math.min(r,n)}}),c}catch(n){return console.error("Failed to create device with required limits",n),c=yield l.requestDevice(),c}}return c},new((t=void 0)||(t=Promise))((function(a,i){function o(n){try{u(r.next(n))}catch(n){i(n)}}function s(n){try{u(r.throw(n))}catch(n){i(n)}}function u(n){var e;n.done?a(n.value):(e=n.value,e instanceof t?e:new t((function(n){n(e)}))).then(o,s)}u((r=r.apply(n,e||[])).next())}));var n,e,t,r}();if(!d)return null;const p=Object.values(i);if(t.some((n=>!p.includes(n))))throw new Error("Invalid distance metrics provided: "+t.join(", "));if(!Object.values(r).includes(a))throw new Error("Invalid aggregation function provided: "+a);const h=1-e;if(f.length!==n.length||f.length!==t.length||f.length!==o.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(n.some((e=>e.length!==n[0].length)))throw new Error("All entry lists must be the same length");const g=n.length,y=n[0].length,A=n.map(((n,e)=>function(n,e=i.HAMMING,t,r={gapOpenPenalty:1,gapExtensionPenalty:.6}){var a,o;let l=null;const c=n.some((n=>"string"==typeof n))?(l="STRING",n.map((n=>new Uint32Array(n.split("").map((n=>n.charCodeAt(0))))))):n.some((n=>"number"==typeof n))?(l="NUMBER",n.map((n=>new Float32Array([n])))):"object"==typeof n[0]&&n.some((n=>"_data"in n&&"_length"in n))?(l="BITARRAY",n.map((n=>n._data))):n.some((n=>n instanceof Float32Array))?(l="FLOAT32ARRAY",n):n.some((n=>n instanceof Uint32Array))?(l="UINT32ARRAY",n):n.some((n=>n instanceof Int32Array))?(l="INT32ARRAY",n):void 0;if(!c||!l)throw new Error("Invalid entry type, could not determine entry type from input list");const f=c[0]instanceof Int32Array?"INT32ARRAY":c[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",m=new Uint32Array(c.map((n=>n.length)));if(!u[l]||!u[l].has(e))throw new Error(`Distance metric '${e}' not supported for entry type '${l}'`);const d=m.reduce(((n,e)=>Math.max(n,e)),0),p=s[e](d),h="INT32ARRAY"===f?Int32Array:"FLOAT32ARRAY"===f?Float32Array:Uint32Array,g=new h(c.length*d);c.forEach(((n,e)=>{g.set(n,e*d)}));let y="",A=0,b="FLOAT32ARRAY",E=null;if(e===i.NEEDLEMAN_WUNSCH||e===i.MONOMER_CHEMICAL_DISTANCE){let n=r.scoringMatrix&&r.alphabetIndexes?Object.keys(r.alphabetIndexes).reduce(((n,e)=>Math.max(n,e.charCodeAt(0))),0):-1;if(!r.alphabetIndexes||!r.scoringMatrix){for(let e=0;e<g.length;e++)g[e]>n&&(n=g[e]);r.scoringMatrix=new Array(n+1).fill(null).map((()=>new Array(n+1).fill(0))),r.alphabetIndexes={};for(let n=0;n<r.scoringMatrix.length;n++)r.scoringMatrix[n][n]=1,r.alphabetIndexes[String.fromCharCode(n)]=n}const e=(n+1)*(n+1),i=new Array(n+1).fill(null).map((()=>new Float32Array(n+1)));for(let e=0;e<n+1;e++)i[e][e]=1;const s=r.alphabetIndexes;for(const n of Object.keys(s))for(const e of Object.keys(s))n!==e&&(i[n.charCodeAt(0)][e.charCodeAt(0)]=r.scoringMatrix[s[n]][s[e]]);A=2+e,b="FLOAT32ARRAY",E=new Float32Array(A),E[0]=null!==(a=r.gapOpenPenalty)&&void 0!==a?a:1,E[1]=null!==(o=r.gapExtensionPenalty)&&void 0!==o?o:.6;let u=2;for(let n=0;n<i.length;n++)E.set(i[n],u),u+=i[n].length;y=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${n+1}>, ${n+1}>`}else if(e===i.Difference){if(!r.range||"number"!=typeof r.range||r.range<=0){const n=g.reduce(((n,e)=>Math.min(n,e)),g[0]),e=g.reduce(((n,e)=>Math.max(n,e)),g[0]);r.range=e-n}r.range<=0&&(r.range=1),A=1,b="FLOAT32ARRAY",E=new Float32Array([r.range]),y=`\n range${t}: f32`}const w=g instanceof Int32Array?"i32":g instanceof Float32Array?"f32":"u32",I=`data${t}: array<array<${w}, ${d}>, ${c.length}>`;return{flatSourceArray:g,sourceArraySize:g.length,maxEntryLen:d,arraySizes:m,complexity:p,suppInfoBuffer:E,suppInfoSize:A,suppInfoType:b,suppInfoStructWgsl:y,entryType:l,dataTypeWGSL:w,dataStructWgsl:I,EncodedArrayConstructor:h}}(n,t[e],e,f[e])));if(0===g)throw new Error("No columns provided. Please provide at least one column of data.");1===g&&(a=r.MANHATTAN);let b=A.map((n=>n.suppInfoStructWgsl)).filter((n=>!!n&&""!=n)).join(",\n"),E=!1;b&&""!=b.trim()||(E=!0,b="\ndummy: f32\n");const w=A.map((n=>n.dataStructWgsl)).filter((n=>!!n&&""!=n)).join(",\n"),I=new Uint32Array(g*y);A.forEach(((n,e)=>{I.set(n.arraySizes,e*y)}));const x=1e4,M=100,v=A.reduce(((n,e)=>n+e.complexity),0),N=Math.ceil(1e4/v),L=Math.ceil(Math.sqrt(Math.ceil(100))),B=10*L,S=y*(y-1)/2,T=Math.ceil(S/x),O=d.createShaderModule({label:"Sparse matrix compute shader",code:`\n // each thread will perform 100 iterations at one time, comparing 100 pairs of entries.\n // in total, each thread will perform at most ${T} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of 100,\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, 100>, 10000>,\n j: array<array<u32, 100>, 10000>,\n distances: array<array<f32, 100>, 10000>,\n found: array<u32, 10000>,\n done: array<u32, 10000>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, 10000>,\n startAtRows: array<u32, 10000>,\n endAtCols: array<u32, 10000>,\n endAtRows: array<u32, 10000>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${y}>, ${g}>,\n // the weights for each entry\n weights: array<f32, ${g}>,\n // the data for each entry\n ${w} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n }\n\n // struct for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${b}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(10, 10) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${E?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${B} + threadCol;\n if (linearIndex >= 10000) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${y}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${y}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${N}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= 100) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${h}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${y}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${m(t,A.map((n=>n.maxEntryLen)),h,a)}\n\n\n `}),R=d.createComputePipeline({label:"sparse matrix compute pipeline",layout:"auto",compute:{module:O,entryPoint:"calcSparseMatrix"}}),C=new Uint32Array(x),U=new Uint32Array(x),P=new Uint32Array(x),$=new Uint32Array(x),j=Math.floor(S/x);let _=0,D=1;console.time("GPUthreadStarts");for(let n=0;n<x;n++){const e=9999===n?S-1:(n+1)*j,t=y-2-Math.floor(Math.sqrt(-8*e+4*y*(y-1)-7)/2-.5),r=e-y*t+Math.floor((t+1)*(t+2)/2);C[n]=D,U[n]=_,P[n]=r,$[n]=t,_=t,D=r}console.timeEnd("GPUthreadStarts");const z=4e4+y*g+g+A.reduce(((n,e)=>n+e.sourceArraySize),0),Y=A.reduce(((n,e)=>n+e.suppInfoSize),0),G=1e6,k=z*Uint32Array.BYTES_PER_ELEMENT;let F=k;const H=15&k;0!==H&&(F+=16-H);const W=d.createBuffer({label:"compute info buffer",size:F,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),q=W.getMappedRange();let V=0;new Uint32Array(q,V,x).set(C),V+=x*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(q,V,x).set(U),V+=x*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(q,V,x).set(P),V+=x*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(q,V,x).set($),V+=x*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(q,V,I.length).set(I),V+=I.length*Uint32Array.BYTES_PER_ELEMENT,new Float32Array(q,V,g).set(o),V+=g*Float32Array.BYTES_PER_ELEMENT;for(const n of A){const e=n.EncodedArrayConstructor,t=n.sourceArraySize;new e(q,V,t).set(n.flatSourceArray),V+=t*e.BYTES_PER_ELEMENT}W.unmap();const K=Y*Uint32Array.BYTES_PER_ELEMENT;let X=K;const Z=15&K;0!==Z&&(X+=16-Z),X=Math.max(X,16);const J=d.createBuffer({label:"supp info buffer",size:X,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),Q=J.getMappedRange();let nn=0;for(const n of A)n.suppInfoBuffer&&n.suppInfoBuffer.byteLength>0&&n.suppInfoSize>0&&(new("UINT32ARRAY"===n.suppInfoType?Uint32Array:Float32Array)(Q,nn,n.suppInfoBuffer.length).set(n.suppInfoBuffer),nn+=n.suppInfoBuffer.byteLength);0===nn&&new Uint32Array(Q,0,4).set([1,1,1,1]),J.unmap();const en=302e4*Uint32Array.BYTES_PER_ELEMENT;let tn=en;const rn=15&en;0!==rn&&(tn+=16-rn);const an=d.createBuffer({label:"results buffer",size:tn,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),on=d.createBindGroup({label:"bindGroup for sparse matrix buffer",layout:R.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:W}},{binding:1,resource:{buffer:J}},{binding:2,resource:{buffer:an}}]}),sn=d.createBuffer({label:"results out buffer",size:an.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),un=[],ln=[],cn=[];let fn=!1;for(;!fn;){const n=d.createCommandEncoder({label:"distance encoder"}),e=n.beginComputePass({label:"distance compute pass"});e.setPipeline(R),e.setBindGroup(0,on),e.dispatchWorkgroups(L,L),e.end(),n.copyBufferToBuffer(an,0,sn,0,sn.size);const t=n.finish();d.queue.submit([t]),yield d.queue.onSubmittedWorkDone(),yield sn.mapAsync(GPUMapMode.READ);const r=sn.getMappedRange();let a=0;const i=new Uint32Array(r,a,G);a+=G*Uint32Array.BYTES_PER_ELEMENT;const o=new Uint32Array(r,a,G);a+=G*Uint32Array.BYTES_PER_ELEMENT;const s=new Float32Array(r,a,G);a+=G*Float32Array.BYTES_PER_ELEMENT;const u=new Uint32Array(r,a,x);a+=x*Uint32Array.BYTES_PER_ELEMENT,fn=new Uint32Array(r,a,x).every((n=>1===n));const l=u.reduce(((n,e)=>n+e),0),c=new Uint32Array(l),f=new Uint32Array(l),m=new Float32Array(l);let p=0;for(let n=0;n<u.length;n++){const e=u[n];0!==e&&(c.set(i.subarray(n*M,n*M+e),p),f.set(o.subarray(n*M,n*M+e),p),m.set(s.subarray(n*M,n*M+e),p),p+=e)}un.push(c),ln.push(f),cn.push(m),sn.unmap()}const mn=un.reduce(((n,e)=>n+e.length),0),dn=new Uint32Array(mn),pn=new Uint32Array(mn),hn=new Float32Array(mn);let gn=0;for(let n=0;n<un.length;n++)dn.set(un[n],gn),pn.set(ln[n],gn),hn.set(cn[n],gn),gn+=un[n].length;return W.destroy(),J.destroy(),an.destroy(),sn.destroy(),{i:dn,j:pn,distance:hn}},new((h=void 0)||(h=Promise))((function(n,e){function t(n){try{a(g.next(n))}catch(n){e(n)}}function r(n){try{a(g.throw(n))}catch(n){e(n)}}function a(e){var a;e.done?n(e.value):(a=e.value,a instanceof h?a:new h((function(n){n(a)}))).then(t,r)}a((g=g.apply(d,p||[])).next())}));var d,p,h,g}function m(n,e,t,r){return n.map(((n,r)=>`\n fn distanceScript${r}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${r}[aIndex];\n let b = computeInfo.data${r}[bIndex];\n let maxDistance: f32 = ${t};\n ${o[n](e[r],r)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${n.length}>;\n ${n.map(((n,e)=>`distances[${e}] = distanceScript${e}(aIndex, bIndex);`)).join("\n")}\n ${a[r](n.length)}\n }\n \n `}var d=t(2590);async function p(n,e,t){const r=n.length,a=[],i=[];for(let o=0;o<r;o++)for(let s=o+1;s<r;s++){const r=n[o],u=n[s];e[r]?.[u]>=t&&(a.push(o),i.push(s))}return function(n,e,t){const r=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),a=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),i=new Float32Array(t.length).fill(0),o=new Float32Array(t.length).fill(0);for(let s=0;s<100;s++){const u=1-s/100;i.fill(0),o.fill(0);for(let t=0;t<n.length;t++){const s=n[t],l=e[t],c=r[s]-r[l],f=a[s]-a[l];Math.abs(c)>=1&&(i[s]-=u*c,i[l]+=u*c),Math.abs(f)>=1&&(o[s]-=u*f,o[l]+=u*f)}for(let n=0;n<t.length;n++){const e=Math.sqrt(i[n]*i[n]+o[n]*o[n]);e>0&&(r[n]+=i[n]/e*u,a[n]+=o[n]/e*u)}}let s=r[0],u=a[0],l=r[0],c=a[0];for(let n=1;n<t.length;n++)s=Math.min(s,r[n]),u=Math.min(u,a[n]),l=Math.max(l,r[n]),c=Math.max(c,a[n]);let f=l-s,m=c-u;0===f&&(f=l);for(let n=0;n<t.length;n++)r[n]=(r[n]-s)/f/2+.5;0===m&&(m=c);for(let n=0;n<t.length;n++)a[n]=(a[n]-u)/m/2+.5;return{embedX:r,embedY:a}}(a,i,n)}const h={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class g{constructor(n={}){this._options={...h,...n}}async transform(n,e){let t=this.toObjectForm(n);if(this._options.maxIterations>0){this.addLoops(t,e),this.normalize(t);for(let n=0;n<this._options.maxIterations;n++)t=this.expand(t,e),this.inflate(t),this.normalize(t)}const{clusters:r,is:a,js:i}=this.assignClusters(t,e);this.correctClusters(r);const o=await this.layout(r,t,e);return{clusters:r,embedX:o.embedX,embedY:o.embedY,is:a,js:i}}correctClusters(n){const e={};for(const t of n)e[t]||(e[t]=0),e[t]++;const t=Object.keys(e).map(Number).sort(((n,t)=>e[n]-e[t])),r={};t.forEach(((n,e)=>r[n]=e+1));for(let e=0;e<n.length;e++)n[e]=r[n[e]]}async layout(n,e,t){const r=new Float32Array(t).fill(0),a=new Float32Array(t).fill(0),i={};n.forEach(((n,e)=>{i[n]||(i[n]=[]),i[n].push(e)}));let o=0;const s=Object.keys(i);s.sort(((n,e)=>i[e].length-i[n].length));let u=6,l=0;for(const n of s){const t=i[n],s=await p(t,e,.001);o===Math.ceil(u/1.5)&&(o=0,l+=5/u,u=Math.ceil(1.5*u));const c=o%u*5/u*1.5;for(let n=0;n<s.embedX.length;n++)r[t[n]]=5*s.embedX[n]/u+c,a[t[n]]=5*s.embedY[n]/u+l;o++}return{embedX:r,embedY:a}}mergeClusters(n,e,t){const r=n[e],a=n[t];for(let e=0;e<n.length;e++)n[e]===a&&(n[e]=r)}assignClusters(n,e){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(e),2))+1,o=Math.pow(10,i),s=new Array(e).fill(-1);for(const e of Object.keys(n))for(const i of Object.keys(n[e]))Math.round(n[e][i]*o)/o>0&&n[e][i]!==Number(e)&&Number(i)>Number(e)&&(r.push(Number(e)),a.push(Number(i)),-1!==s[Number(e)]&&-1!==s[Number(i)]?s[Number(e)]!==s[Number(i)]&&this.mergeClusters(s,Number(e),Number(i)):-1!==s[Number(e)]?s[Number(i)]=s[Number(e)]:-1!==s[Number(i)]?s[Number(e)]=s[Number(i)]:(t++,s[Number(e)]=t,s[Number(i)]=t));for(let n=0;n<s.length;n++)-1===s[n]&&(t++,s[n]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a)}}toObjectForm(n){const e={};for(let t=0;t<n.i.length;t++)e[n.i[t]]||(e[n.i[t]]={}),e[n.i[t]][n.j[t]]=1-n.distance[t],e[n.j[t]]||(e[n.j[t]]={}),e[n.j[t]][n.i[t]]=1-n.distance[t];return e}addLoops(n,e){for(let t=0;t<e;t++)n[t]||(n[t]={}),n[t][t]=this._options.multFactor}normalize(n){for(const e of Object.keys(n)){const t=n[e];let r=0;for(const n of Object.keys(t))r+=t[n];if(0!==r)for(const a of Object.keys(t))n[e][a]/=r}}expand(n,e){const t={},r=Math.floor(Math.max(Math.log10(e),2))+1,a=Math.pow(10,r);for(let r=0;r<e;r++)if(n[r]){t[r]={};for(let i=r;i<e;i++){if(!n[r]?.[i])continue;const e=this.getExpandValue(n,r,i);Math.round(e*a)/a>0&&(t[r][i]=e,t[i]||(t[i]={}),t[i][r]=e)}}return t}inflate(n){for(const e of Object.keys(n)){const t=n[e];for(const r of Object.keys(t))n[e][r]=Math.pow(n[e][r],this._options.inflateFactor)}}getExpandValue(n,e,t){let r=0;const a=Object.keys(n[e]??{}),i=Object.keys(n[t]??{});for(const o of a)i.includes(o)&&(r+=n[e][o]*n[t][o]);return r}}onmessage=async n=>{const{data:e,threshold:t,weights:r,aggregationMethod:a,distanceFnArgs:i,distanceFns:o,maxIterations:s,useWebGPU:u}=n.data;console.time("sparse matrix");let l=null;if(u)try{l=await f(e,t/100,o,a,r,i)}catch(n){console.error(n)}l||(u&&console.error("WEBGPU sparse matrix calculation failed, falling back to CPU implementation"),l=await(new d._).calcMultiColumn(e,o,t/100,i,r,a)),console.timeEnd("sparse matrix");const c=await new g({maxIterations:s??5}).transform(l,e[0].length);postMessage({res:c})}},6814:(n,e,t)=>{t.d(e,{cZ:()=>a,kK:()=>r}),t(7862);const r=n=>null==n;function a(n,e,t,r){if(t>n[n.length-1])return;const a=n.findIndex((n=>t<n));n.pop(),n.splice(a,0,t),e.pop(),e.splice(a,0,r)}}},r={};function a(n){var e=r[n];if(void 0!==e)return e.exports;var i=r[n]={exports:{}};return t[n](i,i.exports,a),i.exports}a.m=t,a.x=()=>{var n=a.O(void 0,[590],(()=>a(8960)));return a.O(n)},n=[],a.O=(e,t,r,i)=>{if(!t){var o=1/0;for(c=0;c<n.length;c++){for(var[t,r,i]=n[c],s=!0,u=0;u<t.length;u++)(!1&i||o>=i)&&Object.keys(a.O).every((n=>a.O[n](t[u])))?t.splice(u--,1):(s=!1,i<o&&(o=i));if(s){n.splice(c--,1);var l=r();void 0!==l&&(e=l)}}return e}i=i||0;for(var c=n.length;c>0&&n[c-1][2]>i;c--)n[c]=n[c-1];n[c]=[t,r,i]},a.d=(n,e)=>{for(var t in e)a.o(e,t)&&!a.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},a.f={},a.e=n=>Promise.all(Object.keys(a.f).reduce(((e,t)=>(a.f[t](n,e),e)),[])),a.u=n=>n+".js",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"==typeof window)return window}}(),a.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),(()=>{var n;a.g.importScripts&&(n=a.g.location+"");var e=a.g.document;if(!n&&e&&(e.currentScript&&(n=e.currentScript.src),!n)){var t=e.getElementsByTagName("script");if(t.length)for(var r=t.length-1;r>-1&&!n;)n=t[r--].src}if(!n)throw new Error("Automatic publicPath is not supported in this browser");n=n.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=n})(),(()=>{a.b=self.location+"";var n={246:1};a.f.i=(e,t)=>{n[e]||importScripts(a.p+a.u(e))};var e=self.webpackChunkeda=self.webpackChunkeda||[],t=e.push.bind(e);e.push=e=>{var[r,i,o]=e;for(var s in i)a.o(i,s)&&(a.m[s]=i[s]);for(o&&o(a);r.length;)n[r.pop()]=1;t(e)}})(),e=a.x,a.x=()=>a.e(590).then(e);var i=a.x();eda=i})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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REEsSUFBSU8sRUFBSThULEVBQVFyVSxPQUFTLEVBQ2xCTyxHQUFLLElBQU13VCxHQUFXQSxFQUFZTSxFQUFROVQsS0FBSzZULEdBRXhELENBSUQsSUFBS0wsRUFBVyxNQUFNLElBQUlsVSxNQUFNLHlEQUNoQ2tVLEVBQVlBLEVBQVVRLFFBQVEsT0FBUSxJQUFJQSxRQUFRLFFBQVMsSUFBSUEsUUFBUSxZQUFhLEtBQ3BGekMsRUFBb0IwQyxFQUFJVCxDLFdDbEJ4QmpDLEVBQW9CalEsRUFBSTRTLEtBQUtSLFNBQVcsR0FJeEMsSUFBSVMsRUFBa0IsQ0FDckIsSUFBSyxHQWdCTjVDLEVBQW9CbUIsRUFBRTFTLEVBQUksQ0FBQzJTLEVBQVNFLEtBRS9Cc0IsRUFBZ0J4QixJQUVsQmMsY0FBY2xDLEVBQW9CMEMsRUFBSTFDLEVBQW9CdUIsRUFBRUgsR0FFOUQsRUFHRCxJQUFJeUIsRUFBcUJGLEtBQXNCLGdCQUFJQSxLQUFzQixpQkFBSyxHQUMxRUcsRUFBNkJELEVBQW1CMUosS0FBSzRKLEtBQUtGLEdBQzlEQSxFQUFtQjFKLEtBdkJDc0YsSUFDbkIsSUFBS2dDLEVBQVV1QyxFQUFhQyxHQUFXeEUsRUFDdkMsSUFBSSxJQUFJd0IsS0FBWStDLEVBQ2hCaEQsRUFBb0JlLEVBQUVpQyxFQUFhL0MsS0FDckNELEVBQW9CTSxFQUFFTCxHQUFZK0MsRUFBWS9DLElBSWhELElBREdnRCxHQUFTQSxFQUFRakQsR0FDZFMsRUFBU3ZTLFFBQ2QwVSxFQUFnQm5DLEVBQVNaLE9BQVMsRUFDbkNpRCxFQUEyQnJFLEVBQUssQyxLakJuQjdCN1YsRUFBT29YLEVBQW9CWixFQUMvQlksRUFBb0JaLEVBQUksSUFDaEJZLEVBQW9CclQsRUFBRSxLQUFLZCxLQUFLakQsR2tCRHhDLElBQUkyWCxFQUFzQlAsRUFBb0JaLEkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL3N0YXJ0dXAgY2h1bmsgZGVwZW5kZW5jaWVzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1hZ2dyZWdhdGlvbi5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9nZXRHUFVEZXZpY2UuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3NwYXJzZS1tYXRyaXgvd2ViR1BVLXNwYXJzZS1tYXRyaXguanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3ByZXByb2Nlc3Npbmcvd2ViR1BVLXByb2Nlc3MtaW5mby5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvTUNML2Jpby1sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL01DTC9tYXJjb3YtY2x1c3Rlci5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvTUNML21jbC13b3JrZXIuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL2Rpc3RhbmNlLW1hdHJpeC91dGlscy5qcyIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2dldCBqYXZhc2NyaXB0IGNodW5rIGZpbGVuYW1lIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvcHVibGljUGF0aCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2ltcG9ydFNjcmlwdHMgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWZlcnJlZCA9IFtdO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5PID0gKHJlc3VsdCwgY2h1bmtJZHMsIGZuLCBwcmlvcml0eSkgPT4ge1xuXHRpZihjaHVua0lkcykge1xuXHRcdHByaW9yaXR5ID0gcHJpb3JpdHkgfHwgMDtcblx0XHRmb3IodmFyIGkgPSBkZWZlcnJlZC5sZW5ndGg7IGkgPiAwICYmIGRlZmVycmVkW2kgLSAxXVsyXSA+IHByaW9yaXR5OyBpLS0pIGRlZmVycmVkW2ldID0gZGVmZXJyZWRbaSAtIDFdO1xuXHRcdGRlZmVycmVkW2ldID0gW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldO1xuXHRcdHJldHVybjtcblx0fVxuXHR2YXIgbm90RnVsZmlsbGVkID0gSW5maW5pdHk7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWQubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgW2NodW5rSWRzLCBmbiwgcHJpb3JpdHldID0gZGVmZXJyZWRbaV07XG5cdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjaHVua0lkcy5sZW5ndGg7IGorKykge1xuXHRcdFx0aWYgKChwcmlvcml0eSAmIDEgPT09IDAgfHwgbm90RnVsZmlsbGVkID49IHByaW9yaXR5KSAmJiBPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLk8pLmV2ZXJ5KChrZXkpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fLk9ba2V5XShjaHVua0lkc1tqXSkpKSkge1xuXHRcdFx0XHRjaHVua0lkcy5zcGxpY2Uoai0tLCAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZ1bGZpbGxlZCA9IGZhbHNlO1xuXHRcdFx0XHRpZihwcmlvcml0eSA8IG5vdEZ1bGZpbGxlZCkgbm90RnVsZmlsbGVkID0gcHJpb3JpdHk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmKGZ1bGZpbGxlZCkge1xuXHRcdFx0ZGVmZXJyZWQuc3BsaWNlKGktLSwgMSlcblx0XHRcdHZhciByID0gZm4oKTtcblx0XHRcdGlmIChyICE9PSB1bmRlZmluZWQpIHJlc3VsdCA9IHI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59OyIsInZhciBuZXh0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy54O1xuX193ZWJwYWNrX3JlcXVpcmVfXy54ID0gKCkgPT4ge1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5lKDU5MCkudGhlbihuZXh0KTtcbn07IiwiZnVuY3Rpb24gZXVjbGlkZWFuQWdncmVnYXRpb25XZ3NsKGFycmF5U2l6ZSkge1xuICAgIHJldHVybiBgXG4gICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7YXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgICAgc3VtID0gc3VtICsgZGlzdGFuY2VzW2ldICogZGlzdGFuY2VzW2ldICogY29tcHV0ZUluZm8ud2VpZ2h0c1tpXSAqIGNvbXB1dGVJbmZvLndlaWdodHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNxcnQoc3VtKTtcbiAgICBgO1xufVxuO1xuZnVuY3Rpb24gbWFuaGF0dGFuQWdncmVnYXRpb25XZ3NsKGFycmF5U2l6ZSkge1xuICAgIHJldHVybiBgXG4gICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7YXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgICAgc3VtID0gc3VtICsgYWJzKGRpc3RhbmNlc1tpXSkgKiBjb21wdXRlSW5mby53ZWlnaHRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgYDtcbn1cbmV4cG9ydCB2YXIgV0VCR1NMQUdHUkVHQVRJT047XG4oZnVuY3Rpb24gKFdFQkdTTEFHR1JFR0FUSU9OKSB7XG4gICAgV0VCR1NMQUdHUkVHQVRJT05bXCJFVUNMSURFQU5cIl0gPSBcIkVVQ0xJREVBTlwiO1xuICAgIFdFQkdTTEFHR1JFR0FUSU9OW1wiTUFOSEFUVEFOXCJdID0gXCJNQU5IQVRUQU5cIjtcbn0pKFdFQkdTTEFHR1JFR0FUSU9OIHx8IChXRUJHU0xBR0dSRUdBVElPTiA9IHt9KSk7XG5leHBvcnQgY29uc3QgV0VCR1NMQUdHUkVHQVRJT05GVU5DVElPTlMgPSB7XG4gICAgW1dFQkdTTEFHR1JFR0FUSU9OLkVVQ0xJREVBTl06IGV1Y2xpZGVhbkFnZ3JlZ2F0aW9uV2dzbCxcbiAgICBbV0VCR1NMQUdHUkVHQVRJT04uTUFOSEFUVEFOXTogbWFuaGF0dGFuQWdncmVnYXRpb25XZ3NsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLWFnZ3JlZ2F0aW9uLmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8vIGluIGFsbCB0aGUgZnVuY3Rpb25zIGJlbG93LCB0aGUgdmFyaWFibGVzIGEgYW5kIGIgYXJlIGFzc3VtZWQgdG8gYmUgYXJyYXlzIG9mIHVpbnQzMi9mMzJcbi8vdmFsdWVzIHdoaWNoIGFyZSBpbmZlcmVkIGZyb20gdGhlIGNvZGUgdGhpcyBjaHVuayBpcyBpbmplY3RlZCBpbnRvXG4vLyBhbHNvLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wdXRlSW5mbyBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuLy8gY29tcHV0ZUluZm8uZW50cnlTaXplczogYXJyYXkgb2YgYXJyYXlzIG9mIHUzMiBjb250YWluaW5nIHRoZSBzaXplcyBvZiB0aGUgZW50cmllc1xuLy8gb3RoZXIgZmllbGRzIGFyZSBzcGVjaWZpYyB0byB0aGUgZGlzdGFuY2UgZnVuY3Rpb24gc2hvdWxkIGJlIGluamVjdGVkIGZyb20gdGhlIG1haW4gc2NyaXB0IHRoYXQgY2FsbHMgdGhpcyBmdW5jdGlvbixcbi8vIGFuZCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBzdXBwbGVtZW50YXJ5SW5mbyBzdHJ1Y3Rcbi8vIGxpa2UgdGhlIHNpbWlsYXJpdHkgbWF0cml4IGZvciBtb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlLlxuLy8gdGhlIGdldFByb2Nlc3NJbmZvIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gY29ycmVjdCBidWZmZXIgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIHRoZSBzdXBwbGVtZW50YXJ5SW5mbyxcbi8vIGZvciBldmVyeSBlbnRyeSBsaXN0XG4vLyB0aGUgbWF4RGlzdGFuY2UgdmFyaWFibGUgaXMgYWxzbyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGVcbi8vIHNjb3BlIG9mIHRoZSBmdW5jdGlvbiwgaW4gY2FzZSBvZiBrbm4gaXQgaXMgdGhlIGRpc3RhbmNlIGluIHRoZSBsYXN0IHBvc3Rpb24gb2Yga25uIG9uIHRoaXMgaW5kZXgsXG4vLyBpbiBjYXNlIG9mIHNwYXJzZSBtYXRyaXgsIGl0IGNhbiBiZSBqdXN0IHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBkaXN0YW5jZS5cbi8vIGhhbW1pbmcgZGlzdGFuY2UgZm9yIHNlcXVuZW5jZXMgb2YgdWludDMyIGFycmF5cyBvZiBtYXggbGVuZ3RoICR7bWF4QXJyYXlTaXplfVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUhhbW1pbmcoX21heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gIGxldCBiTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2JJbmRleF07XG4gIGxldCBtYXhMZW5ndGg6IHUzMiA9IG1heChhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IG1pbkxlbmd0aDogdTMyID0gbWluKGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgc2l6ZURpZmY6IHUzMiA9IG1heExlbmd0aCAtIG1pbkxlbmd0aDtcbiAgXG4gIGxldCBtYXhJbnREaXN0YW5jZSA9IGNlaWwobWF4RGlzdGFuY2UgKiBmMzIobWF4TGVuZ3RoKSkgLSBmMzIoc2l6ZURpZmYpO1xuXG4gIHZhciBkaWZmOiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7X21heEFycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICAgIGRpZmYgPSBkaWZmICsgZjMyKGFbaV0gIT0gYltpXSk7XG4gICAgICBpZiAoZGlmZiA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICB9XG4gIH1cbiAgZGlmZiArPSBmMzIoc2l6ZURpZmYpO1xuICByZXR1cm4gZGlmZiAvICR7X21heEFycmF5U2l6ZX07XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTW9ub21lckNoZW1pY2FsRGlzdGFuY2UoX21heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIC8vIGl0IGlzIGFzc3VtZXQgdGhhdCBzdXBwSW5mbyBzdHJ1Y3QgY29udGFpbnMgY29ycmVjdCBtYXRyaXggY2FsbGVkIHNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9LCAoc2ltaWxhcml0eU1hdHJpeDAsIHNpbWlsYXJpdHlNYXRyaXgxLCBldGMpXG4gICAgLy8gdGhpcyBzaG91bGQgYmUgZ3VhcmFudGVlZCBieSB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24uXG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBzaXplRGlmZjogdTMyID0gbWF4TGVuZ3RoIC0gbWluTGVuZ3RoO1xuICBcbiAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKSAtIGYzMihzaXplRGlmZik7XG5cbiAgbGV0IHNpbU1hdHJpeCA9ICYoc3VwcEluZm8uc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH0pOyAvLyB1c2luZyBwb2ludGVycyBtYWtlIHRoaW5ncyBmYXN0ZXJcbiAgdmFyIGRpZmY6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHtfbWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgZGlmZiA9IGRpZmYgKyAxLjAgLSAoKnNpbU1hdHJpeClbdTMyKGFbaV0pXVt1MzIoYltpXSldO1xuICAgICAgaWYgKGRpZmYgPiBtYXhJbnREaXN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgICAgfVxuICB9XG4gIGRpZmYgKz0gZjMyKHNpemVEaWZmKTtcbiAgcmV0dXJuIGRpZmYgLyAke19tYXhBcnJheVNpemV9O1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUxldmVuc3RlaW4obWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG5cbiAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKTtcblxuICAvLyB3ZSB3aWxsIHN0b3JlIHR3byBhcnJheXMgYXMgbWF0cml4IGFuZCBzd2FwIHRoZSB3b3JraW5nIGluZGljZXMgcGVyIHBhc3MuXG4gIC8vIHRoaXMgd2F5IHdlIGNhbiByZWR1Y2UgbWVtb3J5IHVzYWdlIHBlciBjb21wdXRhdGlvbiB0byBqdXN0IE8oYUxlbmd0aClcbiAgLy8gdGhlIGdyaWQgd2lsbCBoYXZlIGFMZW5ndGggKyAxIGNvbHVtbnMgYW5kIGJMZW5ndGggKyAxIHJvd3NcbiAgLy8gdGhpcyB3aWxsIGJlIGd1YXJhbnRlZWQgYnkgaXRlcmF0aW9uLCBidXQgdGhlIGFycmF5IHNpemVzIG11c3QgYmUga25vd24gYXQgY29tcGlsZSB0aW1lLCBzbyB3ZSB3aWxsIHVzZSBhIGZpeGVkIHNpemUgb2YgbWF4QXJyYXlTaXplXG4gIHZhciBkeW5hbWljUGFzc01hdDogYXJyYXk8YXJyYXk8ZjMyLCAke21heEFycmF5U2l6ZSArIDF9dT4sIDI+OyAvLyBpbml0aWFsaXplIHRvIDBcbiAgXG4gIHZhciBwcmV2SW5kZXg6IHUzMiA9IDA7XG4gIHZhciBjdXJJbmRleDogdTMyID0gMTsgLy8gd2Ugd2lsbCBzd2FwIHRoZXNlIGluZGljZXMgcGVyIHBhc3NcblxuICAvLyBpbml0aWFsaXplIHRoZSBmaXJzdCByb3dcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDw9IGFMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgIGR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF1baV0gPSBmMzIoaSk7XG4gIH1cblxuICAvLyBpdGVyYXRlIG92ZXIgdGhlIHJvd3NcbiAgZm9yICh2YXIgaSA9IDF1OyBpIDw9IGJMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgIGR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XVswXSA9IGYzMihpKTtcbiAgICAgIHZhciBtaW5FbnRyeTogZjMyID0gZjMyKG1heExlbmd0aCk7XG4gICAgICBsZXQgcHJldlJvdyA9ICZkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdO1xuICAgICAgbGV0IGN1clJvdyA9ICZkeW5hbWljUGFzc01hdFtjdXJJbmRleF07XG4gICAgICBsZXQgYk1vbiA9IHUzMihiW2kgLSAxXSk7XG4gICAgICBmb3IgKHZhciBqID0gMXU7IGogPD0gYUxlbmd0aDsgaiA9IGogKyAxdSkge1xuICAgICAgICAgIHZhciBjb3N0OiBmMzIgPSBmMzIoYVtqIC0gMV0gIT0gYk1vbik7XG4gICAgICAgICAgdmFyIHJlczogZjMyID0gbWluKFxuICAgICAgICAgICAgICBtaW4oXG4gICAgICAgICAgICAgICAgKCpwcmV2Um93KVtqXSArIDEuMCwgLy8gZGVsZXRpb25cbiAgICAgICAgICAgICAgICAoKmN1clJvdylbaiAtIDFdICsgMS4wLCAvLyBpbnNlcnRpb25cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKCpwcmV2Um93KVtqIC0gMV0gKyBjb3N0IC8vIHN1YnN0aXR1dGlvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAoKmN1clJvdylbal0gPSByZXM7XG4gICAgICAgICAgaWYgKHJlcyA8IG1pbkVudHJ5KSB7XG4gICAgICAgICAgICAgIG1pbkVudHJ5ID0gcmVzO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHN3YXAgdGhlIGluZGljZXNcbiAgICAgIGxldCB0ZW1wOiB1MzIgPSBwcmV2SW5kZXg7XG4gICAgICBwcmV2SW5kZXggPSBjdXJJbmRleDtcbiAgICAgIGN1ckluZGV4ID0gdGVtcDtcbiAgICAgIGlmIChtaW5FbnRyeSA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2FMZW5ndGhdIC8gZjMyKG1heExlbmd0aCk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTmVlZGxlbWFuV3Vuc2NoKG1heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIC8vIHZlcnNpb24gb2YgdGhlIGxldmVuc2h0YWluIHdoZXJlIHRoZSBjb3N0IG9mIHN1YnN0aXR1dGlvbiBpcyBjdXN0b21pemFibGVcbiAgICAvLyBpdCBpcyBhc3N1bWV0IHRoYXQgc3VwcEluZm8gc3RydWN0IGNvbnRhaW5zIGNvcnJlY3QgbWF0cml4IGNhbGxlZCBzaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fSwgKHNpbWlsYXJpdHlNYXRyaXgwLCBzaW1pbGFyaXR5TWF0cml4MSwgZXRjKVxuICAgIC8vIGFuZCBnYXBPcGVuUGVuYWx0eSwgZ2FwRXh0ZW5zaW9uUGVuYWx0eVxuICAgIC8vIHRoaXMgc2hvdWxkIGJlIGd1YXJhbnRlZWQgYnkgdGhlIGdldFByb2Nlc3NJbmZvIGZ1bmN0aW9uLlxuICAgIHJldHVybiBgXG4gICAgICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICAgICAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgICAgIGxldCBtYXhMZW5ndGg6IHUzMiA9IG1heChhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgICAgIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgXG4gICAgICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpO1xuICAgICAgLy8gd2Ugd2lsbCBzdG9yZSB0d28gYXJyYXlzIGFzIG1hdHJpeCBhbmQgc3dhcCB0aGUgd29ya2luZyBpbmRpY2VzIHBlciBwYXNzLlxuICAgICAgLy8gdGhpcyB3YXkgd2UgY2FuIHJlZHVjZSBtZW1vcnkgdXNhZ2UgcGVyIGNvbXB1dGF0aW9uIHRvIGp1c3QgTyhhTGVuZ3RoKVxuICAgICAgLy8gdGhlIGdyaWQgd2lsbCBoYXZlIGFMZW5ndGggKyAxIGNvbHVtbnMgYW5kIGJMZW5ndGggKyAxIHJvd3NcbiAgICAgIC8vIHRoaXMgd2lsbCBiZSBndWFyYW50ZWVkIGJ5IGl0ZXJhdGlvbiwgYnV0IHRoZSBhcnJheSBzaXplcyBtdXN0IGJlIGtub3duIGF0IGNvbXBpbGUgdGltZSwgc28gd2Ugd2lsbCB1c2UgYSBmaXhlZCBzaXplIG9mIG1heEFycmF5U2l6ZVxuICAgICAgdmFyIGR5bmFtaWNQYXNzTWF0OiBhcnJheTxhcnJheTxmMzIsICR7bWF4QXJyYXlTaXplICsgMX11PiwgMj47IC8vIGluaXRpYWxpemUgdG8gMFxuICAgICAgXG4gICAgICAvLyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb3BlcmF0aW9uIGxlZCB0byB0aGUgY3VycmVudCBjZWxsXG4gICAgICAvLyBpLmUuIHdoZXRoZXIgd2UgY2FtZSBmcm9tIHRoZSBsZWZ0LCB0b3Agb3IgZGlhZ29uYWwgdG8gYXNzaWduIGdhcCBvcGVuL2dhcCBleHRlbmQgcGVuYWx0eVxuICAgICAgdmFyIHZlcnRpY2FsR2FwczogYXJyYXk8dTMyLCAke21heEFycmF5U2l6ZSArIDF9dT47XG4gICAgICB2YXIgaG9yaXpvbnRhbEdhcHM6IGFycmF5PHUzMiwgJHttYXhBcnJheVNpemUgKyAxfXU+O1xuXG4gICAgICBsZXQgZ2FwT3BlblBlbmFsdHk6IGYzMiA9IHN1cHBJbmZvLmdhcE9wZW5QZW5hbHR5JHtlbnRyeUluZGV4fTtcbiAgICAgIGxldCBnYXBFeHRlbnNpb25QZW5hbHR5OiBmMzIgPSBzdXBwSW5mby5nYXBFeHRlbnNpb25QZW5hbHR5JHtlbnRyeUluZGV4fTtcbiAgICAgIHZhciBwcmV2SW5kZXg6IHUzMiA9IDA7XG4gICAgICB2YXIgY3VySW5kZXg6IHUzMiA9IDE7IC8vIHdlIHdpbGwgc3dhcCB0aGVzZSBpbmRpY2VzIHBlciBwYXNzXG4gICAgICAvLyBpbml0aWFsaXplIHRoZSBmaXJzdCByb3dcbiAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8PSBhTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVtpXSA9IGdhcE9wZW5QZW5hbHR5ICsgZjMyKGkgLSAxKSAqIGdhcEV4dGVuc2lvblBlbmFsdHk7XG4gICAgICAgICAgZHluYW1pY1Bhc3NNYXRbY3VySW5kZXhdW2ldID0gMC4wO1xuICAgICAgfVxuICAgICAgZHluYW1pY1Bhc3NNYXRbMF1bMF0gPSAwLjA7XG5cbiAgICAgIGxldCBzaW1NYXRyaXggPSAmc3VwcEluZm8uc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH07IC8vIHVzaW5nIHBvaW50ZXJzIG1ha2UgdGhpbmdzIGZhc3RlclxuICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSByb3dzXG4gICAgICBmb3IgKHZhciBpID0gMXU7IGkgPD0gYkxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgIGxldCBwcmV2Um93ID0gJmR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF07XG4gICAgICAgICAgbGV0IGN1clJvdyA9ICZkeW5hbWljUGFzc01hdFtjdXJJbmRleF07XG4gICAgICAgICAgKCpjdXJSb3cpWzBdID0gZ2FwT3BlblBlbmFsdHkgKyBmMzIoaSAtIDEpICogZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICB2YXIgbWluRW50cnk6IGYzMiA9IGYzMihtYXhMZW5ndGgpO1xuICAgICAgICAgIGxldCBtb25CID0gdTMyKGJbaSAtIDFdKTtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMXU7IGogPD0gYUxlbmd0aDsgaiA9IGogKyAxdSkge1xuICAgICAgICAgICAgICBsZXQgbW9uQSA9IHUzMihhW2ogLSAxXSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBsZXQgY29zdDogZjMyID0gKCpwcmV2Um93KVtqIC0gMV0gKyAxZiAtICgqc2ltTWF0cml4KVttb25BXVttb25CXTtcbiAgICAgICAgICAgICAgdmFyIHRvcCA9ICgqcHJldlJvdylbal07IC8vIGRlbGV0aW9uXG4gICAgICAgICAgICAgIGlmICh2ZXJ0aWNhbEdhcHNbal0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKyBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdG9wID0gdG9wICsgZ2FwT3BlblBlbmFsdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGxlZnQgPSAoKmN1clJvdylbaiAtIDFdOyAvLyBpbnNlcnRpb25cbiAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxHYXBzW2ogLSAxXSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ICsgZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ICsgZ2FwT3BlblBlbmFsdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHJlczogZjMyID0gbWluKFxuICAgICAgICAgICAgICAgICAgbWluKFxuICAgICAgICAgICAgICAgICAgICAgIHRvcCwgLy8gZGVsZXRpb25cbiAgICAgICAgICAgICAgICAgICAgICBsZWZ0LCAvLyBpbnNlcnRpb25cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjb3N0IC8vIHN1YnN0aXR1dGlvblxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICgqY3VyUm93KVtqXSA9IHJlcztcbiAgICAgICAgICAgICAgaWYgKHJlcyA8IG1pbkVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICBtaW5FbnRyeSA9IHJlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGdhcHNcbiAgICAgICAgICAgICAgaWYgKHJlcyA9PSBjb3N0KSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSBsZWZ0KSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmVydGljYWxHYXBzW2pdID0gMTtcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzd2FwIHRoZSBpbmRpY2VzXG4gICAgICAgICAgbGV0IHRlbXA6IHUzMiA9IHByZXZJbmRleDtcbiAgICAgICAgICBwcmV2SW5kZXggPSBjdXJJbmRleDtcbiAgICAgICAgICBjdXJJbmRleCA9IHRlbXA7XG4gICAgICAgICAgaWYgKG1pbkVudHJ5ID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVthTGVuZ3RoXSAvIGYzMihtYXhMZW5ndGgpO1xuICBcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVFdWNsaWRlYW4obWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBkaXN0OiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgIGRpc3QgPSBkaXN0ICsgZjMyKGFbaV0gLSBiW2ldKSAqIGYzMihhW2ldIC0gYltpXSk7XG4gIH1cbiAgcmV0dXJuIHNxcnQoZGlzdCk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTWFuaGF0dGFuKG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgZGlzdDogZjMyID0gMC4wO1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICBkaXN0ID0gZGlzdCArIGFicyhmMzIoYVtpXSAtIGJbaV0pKTtcbiAgfVxuICByZXR1cm4gZGlzdDtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVPbmVIb3REaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgaWYgKGFMZW5ndGggIT0gYkxlbmd0aCkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgYUxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgIGlmKGFbaV0gIT0gYltpXSkge1xuICAgICAgcmV0dXJuIDEuMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDAuMDtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVOdW1lcmljRGlzdGFuY2UoX21heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIC8vIHdlIGFzc3VtZSB0aGF0IHJhbmdlJHtlbnRyeUluZGV4fSBpcyBhdmFpbGFibGUgaW4gdGhlIHN1cHBsZW1lbnRhcnlJbmZvIHN0cnVjdFxuICAgIHJldHVybiBgXG4gICAgbGV0IHJhbmdlID0gc3VwcEluZm8ucmFuZ2Uke2VudHJ5SW5kZXh9O1xuICAgIHJldHVybiBmMzIoYWJzKGYzMihhWzBdKSAtIGYzMihiWzBdKSkgLyByYW5nZSk7XG4gIGA7XG59XG4vLyB0YW5pbW90byBkaXN0YW5jZSBmb3IgdWludDMyIGFycmF5cyBvZiBsZW5ndGggJHttYXhBcnJheVNpemV9XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVVGFuaW1vdG9CaXRBcnJheShtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIG9uQml0c2E6IHUzMiA9IDB1O1xuICB2YXIgb25CaXRzYjogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIG9uQml0c2EgPSBvbkJpdHNhICsgY291bnRPbmVCaXRzKGFbaV0pO1xuICAgICAgb25CaXRzYiA9IG9uQml0c2IgKyBjb3VudE9uZUJpdHMoYltpXSk7XG4gIH1cblxuICBpZiAob25CaXRzYSA9PSAwdSAmJiBvbkJpdHNiID09IDB1KSB7XG4gICAgICByZXR1cm4gMC4wO1xuICB9XG5cbiAgbGV0IHRvdGFsT25CaXRzID0gb25CaXRzYSArIG9uQml0c2I7XG4gIHZhciBjb21tb25CaXRzOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgY29tbW9uQml0cyA9IGNvbW1vbkJpdHMgKyBjb3VudE9uZUJpdHMoYVtpXSAmIGJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIGYzMih0b3RhbE9uQml0cyAtIGNvbW1vbkJpdHMpO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUFzeW1tZXRyaWNCaXRBcnJheShtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIG9uQml0c2E6IHUzMiA9IDB1O1xuICB2YXIgb25CaXRzYjogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIG9uQml0c2EgPSBvbkJpdHNhICsgY291bnRPbmVCaXRzKGFbaV0pO1xuICAgICAgb25CaXRzYiA9IG9uQml0c2IgKyBjb3VudE9uZUJpdHMoYltpXSk7XG4gIH1cbiAgbGV0IG1pbiA9IG1pbihvbkJpdHNhLCBvbkJpdHNiKTtcbiAgaWYgKG1pbiA9PSAwdSkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIGYzMihtaW4pO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUNvc2luZUJpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgdG90YWwgPSBvbkJpdHNhICogb25CaXRzYjsgLy8gcC5zLiBoZXJlIHRvdGFsIGlzIHRha2VuIGJ5IG11bHRpcGx5aW5nXG4gIGlmICh0b3RhbCA9PSAwdSkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIHNxcnQoZjMyKHRvdGFsKSk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVU29rYWxCaXRBcnJheShtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIG9uQml0c2E6IHUzMiA9IDB1O1xuICB2YXIgb25CaXRzYjogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIG9uQml0c2EgPSBvbkJpdHNhICsgY291bnRPbmVCaXRzKGFbaV0pO1xuICAgICAgb25CaXRzYiA9IG9uQml0c2IgKyBjb3VudE9uZUJpdHMoYltpXSk7XG4gIH1cbiAgbGV0IHRvdGFsID0gb25CaXRzYSArIG9uQml0c2I7XG4gIGlmICh0b3RhbCA9PSAwdSkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIGYzMih0b3RhbCAqIDIgLSBjb21tb25CaXRzICogMyk7XG4gIGA7XG59XG5leHBvcnQgdmFyIFdFQkdQVURJU1RBTkNFO1xuKGZ1bmN0aW9uIChXRUJHUFVESVNUQU5DRSkge1xuICAgIFdFQkdQVURJU1RBTkNFW1wiSEFNTUlOR1wiXSA9IFwiSGFtbWluZ1wiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiRVVDTElERUFOXCJdID0gXCJFdWNsaWRlYW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIk1BTkhBVFRBTlwiXSA9IFwiTWFuaGF0dGFuXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJUQU5JTU9UT1wiXSA9IFwiVGFuaW1vdG9cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkxFVkVOU1RFSU5cIl0gPSBcIkxldmVuc2h0ZWluXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJORUVETEVNQU5fV1VOU0NIXCJdID0gXCJOZWVkbGVtYW5uLVd1bnNjaFwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRVwiXSA9IFwiTW9ub21lciBjaGVtaWNhbCBkaXN0YW5jZVwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiU09LQUxcIl0gPSBcIlNva2FsXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJDT1NJTkVcIl0gPSBcIkNvc2luZVwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiQVNZTU1FVFJJQ1wiXSA9IFwiQXN5bW1ldHJpY1wiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiRGlmZmVyZW5jZVwiXSA9IFwiRGlmZmVyZW5jZVwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiT25lSG90XCJdID0gXCJPbmUtSG90XCI7XG59KShXRUJHUFVESVNUQU5DRSB8fCAoV0VCR1BVRElTVEFOQ0UgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IHdlYkdQVUZ1bmN0aW9ucyA9IHtcbiAgICBbV0VCR1BVRElTVEFOQ0UuSEFNTUlOR106IHdlYkdQVUhhbW1pbmcsXG4gICAgW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTl06IHdlYkdQVUV1Y2xpZGVhbixcbiAgICBbV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOXTogd2ViR1BVTWFuaGF0dGFuLFxuICAgIFtXRUJHUFVESVNUQU5DRS5UQU5JTU9UT106IHdlYkdQVVRhbmltb3RvQml0QXJyYXksXG4gICAgW1dFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU5dOiB3ZWJHUFVMZXZlbnN0ZWluLFxuICAgIFtXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NIXTogd2ViR1BVTmVlZGxlbWFuV3Vuc2NoLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXTogd2ViR1BVTW9ub21lckNoZW1pY2FsRGlzdGFuY2UsXG4gICAgW1dFQkdQVURJU1RBTkNFLlNPS0FMXTogd2ViR1BVU29rYWxCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQ09TSU5FXTogd2ViR1BVQ29zaW5lQml0QXJyYXksXG4gICAgW1dFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUNdOiB3ZWJHUFVBc3ltbWV0cmljQml0QXJyYXksXG4gICAgW1dFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdOiB3ZWJHUFVOdW1lcmljRGlzdGFuY2UsXG4gICAgW1dFQkdQVURJU1RBTkNFLk9uZUhvdF06IHdlYkdQVU9uZUhvdERpc3RhbmNlXG59O1xuZXhwb3J0IGNvbnN0IGRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5ID0ge1xuICAgIFtXRUJHUFVESVNUQU5DRS5IQU1NSU5HXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDMwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDMwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDMwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuVEFOSU1PVE9dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5TT0tBTF06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkNPU0lORV06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUNdOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5MRVZFTlNURUlOXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAqIG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSF06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgKiBtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMjUpLFxuICAgIFtXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXTogKF9tYXhFbnRyeVNpemUpID0+IDEsXG4gICAgW1dFQkdQVURJU1RBTkNFLk9uZUhvdF06IChfbWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwoX21heEVudHJ5U2l6ZSAvIDQwKSxcbn07XG5leHBvcnQgY29uc3QgVHlwZVN1cHBvcnRlZERpc3RhbmNlcyA9IHtcbiAgICBbXCJTVFJJTkdcIiAvKiBXR1BVRU5UUllUWVBFLlNUUklORyAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkhBTU1JTkcsIFdFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU4sIFdFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0gsIFdFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UsIFdFQkdQVURJU1RBTkNFLk9uZUhvdF0pLFxuICAgIFtcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkhBTU1JTkcsIFdFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFLCBXRUJHUFVESVNUQU5DRS5MRVZFTlNURUlOLCBXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NILCBXRUJHUFVESVNUQU5DRS5UQU5JTU9UTywgV0VCR1BVRElTVEFOQ0UuQ09TSU5FLCBXRUJHUFVESVNUQU5DRS5TT0tBTCwgV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQywgV0VCR1BVRElTVEFOQ0UuT25lSG90LCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5PbmVIb3QsIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiTlVNQkVSXCIgLyogV0dQVUVOVFJZVFlQRS5OVU1CRVIgKi9dOiBuZXcgU2V0KFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU4sIFdFQkdQVURJU1RBTkNFLk1BTkhBVFRBTiwgV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV0pLFxuICAgIFtcIkJJVEFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5CSVRBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLlRBTklNT1RPLCBXRUJHUFVESVNUQU5DRS5DT1NJTkUsIFdFQkdQVURJU1RBTkNFLlNPS0FMLCBXRUJHUFVESVNUQU5DRS5BU1lNTUVUUklDXSlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xubGV0IGdwdUFkYXB0ZXIgPSBudWxsO1xubGV0IGdwdURldmljZSA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gZ2V0R1BVRGV2aWNlKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghZ3B1QWRhcHRlcikge1xuICAgICAgICAgICAgLy9yZWFzb246IG9ubHkgaGVyZSB3ZSBnZXQgdGhlIGdwdUFkYXB0ZXJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgZ3B1QWRhcHRlciA9IHlpZWxkIG5hdmlnYXRvci5ncHUucmVxdWVzdEFkYXB0ZXIoeyBwb3dlclByZWZlcmVuY2U6ICdoaWdoLXBlcmZvcm1hbmNlJyB9KTtcbiAgICAgICAgICAgIGlmIChncHVBZGFwdGVyID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzTG9zdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZ3B1RGV2aWNlKSB7XG4gICAgICAgICAgICBncHVEZXZpY2UubG9zdC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpc0xvc3QgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMCkpOyAvLyB3YWl0IHRvIHNlZSBpZiB0aGUgZGV2aWNlIGlzIGxvc3RcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWdwdURldmljZSB8fCBpc0xvc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkQnVmZmVyU2l6ZSA9IDEwMDAwMDAwMDA7IC8vIH4xMDAwTUJcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXJMaW1pdHMgPSBncHVBZGFwdGVyLmxpbWl0cztcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZmZXJTaXplTGltaXQgPSBhZGFwdGVyTGltaXRzLm1heEJ1ZmZlclNpemU7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0ID0gYWRhcHRlckxpbWl0cy5tYXhTdG9yYWdlQnVmZmVyQmluZGluZ1NpemU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGdwdURldmljZSA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdERldmljZSh7IHJlcXVpcmVkTGltaXRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZmZXJTaXplOiBNYXRoLm1pbihidWZmZmVyU2l6ZUxpbWl0LCByZXF1aXJlZEJ1ZmZlclNpemUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplOiBNYXRoLm1pbihzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0LCByZXF1aXJlZEJ1ZmZlclNpemUpXG4gICAgICAgICAgICAgICAgICAgIH0gfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdwdURldmljZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugd2l0aCByZXF1aXJlZCBsaW1pdHMnLCBlKTtcbiAgICAgICAgICAgICAgICBncHVEZXZpY2UgPSB5aWVsZCBncHVBZGFwdGVyLnJlcXVlc3REZXZpY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3B1RGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncHVEZXZpY2U7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0R1BVQWRhcHRlckRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghZ3B1QWRhcHRlcikge1xuICAgICAgICAgICAgLy8gcmVhc29uOiBvbmx5IGhlcmUgd2UgZ2V0IHRoZSBncHVBZGFwdGVyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgIGdwdUFkYXB0ZXIgPSB5aWVsZCBuYXZpZ2F0b3IuZ3B1LnJlcXVlc3RBZGFwdGVyKCk7XG4gICAgICAgICAgICBpZiAoZ3B1QWRhcHRlciA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZm8gPSB5aWVsZCBncHVBZGFwdGVyLnJlcXVlc3RBZGFwdGVySW5mbygpO1xuICAgICAgICByZXR1cm4gaW5mby5kZXNjcmlwdGlvbjtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldEdQVURldmljZS5qcy5tYXAiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IFdFQkdTTEFHR1JFR0FUSU9OLCBXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OUywgfSBmcm9tICcuLi9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1hZ2dyZWdhdGlvbic7XG5pbXBvcnQgeyBXRUJHUFVESVNUQU5DRSwgd2ViR1BVRnVuY3Rpb25zLCB9IGZyb20gJy4uL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcyc7XG5pbXBvcnQgeyB3ZWJHUFVQcm9jZXNzSW5mbyB9IGZyb20gJy4uL3ByZXByb2Nlc3Npbmcvd2ViR1BVLXByb2Nlc3MtaW5mbyc7XG5pbXBvcnQgeyBnZXRHUFVEZXZpY2UgfSBmcm9tICcuLi9nZXRHUFVEZXZpY2UnO1xuLyoqIGdlbmVyYXRlIHNwYXJzZSBtYXRyaXggYmFzZWQgb24gbGlzdCBvZiBsaXN0cyBvZiBlbnRyaWVzLlxuICogIHRoZXNlIGVudHJpZXMgYXJlIGVhY2ggZW5jb2RlZCBhcyBVaW50MzJBcnJheSBvciBGTE9BVDMyQXJyYXkgKGRlcGVuZGluZyBvbiB0aGVpciB0eXBlKS5cbiAqIGZvciBleGFtcGxlLCBzZXF1ZW5jZXMgd291bGQgYmUgZW5jb2RlZCBhcyBVaW50MzJBcnJheSBiYXNlZCBvbiBjaGFyIGNvZGUgb2YgdGhlIGxldHRlciBhdCBlYWNoIHBvc2l0aW9uLlxuICogWzY1LCA2NiwgNjcsIDY4LCA2OV0gd291bGQgYmUgYSBzZXF1ZW5jZSBvZiA1IGxldHRlcnMuXG4gKiBmb3IgY2hlbWljYWwgZmluZ2VycHJpbnRzLCBpdCB3b3VsZCBiZSBhIGJpbmFyeSBhcnJheSBvZiAwcyBhbmQgMXMsXG4gKiByZXByZXNlbnRlZCBhcyBVaW50MzJBcnJheShfZGF0YSBwcm9wZXJ0eSBvZiBERyBiaXRhcnJheSkuXG4gKlxuICogQmUgd2FyZSB0aGF0IHNpemUgb2YgZW50cnlMaXN0LCBkaXN0YW5jZU1ldHJpY3MsIHdlaWdodHMgYW5kIG9wdGlvbnMgbXVzdCBiZSB0aGUgc2FtZS5cbiAqIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zIGZvciBlbnRyaWVzIGksIHBhc3MgYW4gZW1wdHkgb2JqZWN0LlxuICogZm9yIG5vdyBvcHRpb25zIGFyZSBuZWVkZWQgZm9yXG4gKiBuZWVkbGVtYW4td3Vuc2NoIGFuZCBtb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlczogc2VlIHtAbGluayBCaW9EaXN0YW5jZUZuT3B0aW9uc30gYXMgZm9yIGhvdyBpdCBzaG91bGQgYmUgcGFzc2VkXG4gKiBudW1lcmljIGRpc3RhbmNlcyAoRGlmZmVyZW5jZSk6IHtyYW5nZTogbnVtYmVyfSB3aGVyZSByYW5nZSBpcyB0aGUgcmFuZ2Ugb2YgdGhlIHZhbHVlcyBpbiB0aGUgY29sdW1uIChtYXggLSBtaW4pLlxuICogaW4gYm90aCBjYXNlcywgaWYgb3B0aW9ucyBhcmUgbm90IHByb3ZpZGVkLCB0aGV5IHdpbGwgYmUgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgoZW50cnlMaXN0LCAvLyBsaXN0IG9mIGxpc3RzIG9mIGVudHJpZXMsIGZvciBtdWx0aXBsZSBjb2x1bW5zXG50aHJlc2hvbGQgPSAwLjgsIC8vIHNpbWlsYXJpdHkgdGhyZXNob2xkLCBiZSB3YXJlIHRoYXQgaWYgeW91IHVzZSB0b28gc21hbGwgdGhyZXNob2xkLCB0aGVyZSBtaWdodCBiZSBtZW1vcnkgb3ZlcmZsb3cuLi5cbmRpc3RhbmNlTWV0cmljcywgLy8gZGlzdGFuY2UgbWV0cmljcyBmb3IgZWFjaCBjb2x1bW5cbmFnZ3JlZ2F0aW9uRnVuY3Rpb24sIC8vIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgZGlzdGFuY2VzXG53ZWlnaHRzLCAvLyB3ZWlnaHRzIGZvciBlYWNoIGNvbHVtblxub3B0aW9ucyAvLyBzdXBwbGVtZW50YXJ5IG9wdGlvbnMgZm9yIGVhY2ggY29sdW1uXG4pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBkZXZpY2UgPSB5aWVsZCBnZXRHUFVEZXZpY2UoKTtcbiAgICAgICAgaWYgKCFkZXZpY2UpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gaWYgbm8gZGV2aWNlLCByZXR1cm4gbnVsbCwgYXMgd2UgY2Fubm90IGRvIGFueXRoaW5nIHdpdGhvdXQgaXQuXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZURpc3RhbmNlTWV0cmljcyA9IE9iamVjdC52YWx1ZXMoV0VCR1BVRElTVEFOQ0UpO1xuICAgICAgICBpZiAoZGlzdGFuY2VNZXRyaWNzLnNvbWUoKG1ldHJpYykgPT4gIWF2YWlsYWJsZURpc3RhbmNlTWV0cmljcy5pbmNsdWRlcyhtZXRyaWMpKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkaXN0YW5jZSBtZXRyaWNzIHByb3ZpZGVkOiAnICsgZGlzdGFuY2VNZXRyaWNzLmpvaW4oJywgJykpO1xuICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2dyZWdhdGlvbkZ1bmN0aW9ucyA9IE9iamVjdC52YWx1ZXMoV0VCR1NMQUdHUkVHQVRJT04pO1xuICAgICAgICBpZiAoIWF2YWlsYWJsZUFnZ3JlZ2F0aW9uRnVuY3Rpb25zLmluY2x1ZGVzKGFnZ3JlZ2F0aW9uRnVuY3Rpb24pKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIHByb3ZpZGVkOiAnICsgYWdncmVnYXRpb25GdW5jdGlvbik7XG4gICAgICAgIGNvbnN0IG1heERpc3RhbmNlID0gMSAtIHRocmVzaG9sZDsgLy8gbWF4aW11bSBkaXN0YW5jZVxuICAgICAgICAvLyBmaXJzdCwgY2hlY2sgdGhhdCBhbGwgdGhlIHN1cHBsZW1lbnRhcnkgb3B0aW9ucyBhcmUgcHJvdmlkZWQgYW5kIGFyZSB0aGUgc2FtZSBsZW5ndGg6XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCAhPT0gZW50cnlMaXN0Lmxlbmd0aCB8fFxuICAgICAgICAgICAgb3B0aW9ucy5sZW5ndGggIT09IGRpc3RhbmNlTWV0cmljcy5sZW5ndGggfHxcbiAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPcHRpb25zLCB3ZWlndGhzIGFuZCBkaXN0YW5jZSBmdW5jdGlvbnMgbXVzdCBiZSBwcm92aWRlZCBmb3IgZWFjaCBjb2x1bW4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB0aGF0IGFsbCB0aGUgZW50cnkgbGlzdHMgYXJlIHRoZSBzYW1lIGxlbmd0aFxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGxpc3QpID0+IGxpc3QubGVuZ3RoICE9PSBlbnRyeUxpc3RbMF0ubGVuZ3RoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIGVudHJ5IGxpc3RzIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IG51bU9mQ29sdW1ucyA9IGVudHJ5TGlzdC5sZW5ndGg7IC8vIG51bWJlciBvZiBjb2x1bW5zXG4gICAgICAgIGNvbnN0IGxpc3RTaXplID0gZW50cnlMaXN0WzBdLmxlbmd0aDsgLy8gc2l6ZSBvZiBlYWNoIGxpc3QgKG9yIGNvbHVtbilcbiAgICAgICAgY29uc3QgcHJvY2Vzc0luZm8gPSBlbnRyeUxpc3QubWFwKChlbnRyeSwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdlYkdQVVByb2Nlc3NJbmZvKGVudHJ5LCBkaXN0YW5jZU1ldHJpY3NbaV0sIGksIG9wdGlvbnNbaV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG51bU9mQ29sdW1ucyA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb2x1bW5zIHByb3ZpZGVkLiBQbGVhc2UgcHJvdmlkZSBhdCBsZWFzdCBvbmUgY29sdW1uIG9mIGRhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bU9mQ29sdW1ucyA9PT0gMSlcbiAgICAgICAgICAgIGFnZ3JlZ2F0aW9uRnVuY3Rpb24gPSBXRUJHU0xBR0dSRUdBVElPTi5NQU5IQVRUQU47IC8vIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgICAgICAvLyBjb21iaW5lIGFsbCBzdHJ1Y3QgdHlwZXMgaW50byBvbmUgdG8gcHV0IGludG8gdGhlIHN1cHBJbmZvIHN0cnVjdC5cbiAgICAgICAgbGV0IHN1cHBJbmZvV2dzbCA9IHByb2Nlc3NJbmZvXG4gICAgICAgICAgICAubWFwKChpbmZvKSA9PiBpbmZvLnN1cHBJbmZvU3RydWN0V2dzbClcbiAgICAgICAgICAgIC5maWx0ZXIoKHdnc2wpID0+ICEhd2dzbCAmJiB3Z3NsICE9ICcnKVxuICAgICAgICAgICAgLmpvaW4oJyxcXG4nKTtcbiAgICAgICAgLy8gc3RydWN0dXJlcyBpbiB3Z3NsIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWVtYmVyLCBzbyBpZiB3ZSBoYXZlIG5vIHN0cnVjdHVyZXMsIHdlIG5lZWQgdG8gYWRkIGEgZHVtbXkgb25lXG4gICAgICAgIGxldCBuZWVkc0R1bW15ID0gZmFsc2U7XG4gICAgICAgIGlmICghc3VwcEluZm9XZ3NsIHx8IHN1cHBJbmZvV2dzbC50cmltKCkgPT0gJycpIHtcbiAgICAgICAgICAgIG5lZWRzRHVtbXkgPSB0cnVlO1xuICAgICAgICAgICAgc3VwcEluZm9XZ3NsID0gJ1xcbmR1bW15OiBmMzJcXG4nO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbWJpbmUgYWxsIGRhdGEgd2dzbCBzdHJ1Y3QgY29kZSBpbnRvIG9uZVxuICAgICAgICBjb25zdCBkYXRhV2dzbCA9IHByb2Nlc3NJbmZvLm1hcCgoaW5mbykgPT4gaW5mby5kYXRhU3RydWN0V2dzbCkuZmlsdGVyKCh3Z3NsKSA9PiAhIXdnc2wgJiYgd2dzbCAhPSAnJykuam9pbignLFxcbicpO1xuICAgICAgICAvLyBjb21iaW5lIGFsbCBhcnJheSBzaXplcyBpbnRvIG9uZSBhcnJheSAoZWFzaWVyIGZvciBzZXR0aW5nKVxuICAgICAgICBjb25zdCBhcnJheVNpemVzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mQ29sdW1ucyAqIGxpc3RTaXplKTtcbiAgICAgICAgcHJvY2Vzc0luZm8uZm9yRWFjaCgoaW5mbywgaSkgPT4ge1xuICAgICAgICAgICAgYXJyYXlTaXplcy5zZXQoaW5mby5hcnJheVNpemVzLCBpICogbGlzdFNpemUpO1xuICAgICAgICB9KTsgLy8gYXJyYXkuZmxhdCBpcyBub3QgYXMgb3B0aW1pemVkIGFzIHRoaXNcbiAgICAgICAgLy8gaWYgd2UgdHJ5IHRvIG1hcCBsYXJnZSBhcnJheXMgZGlyZWN0bHkgZnJvbSBHUFUsIHNvbWV0aW1lcywgZGV2aWNlIGRpc2Nvbm5lY3RzLiBzbyB3ZSBuZWVkIHRvIGRvIGl0IGluIGNodW5rcywgYSBnb29kIG51bWJlclxuICAgICAgICAvLyB3ZSBmb3VuZCBpcyAxMDAwMC4gU28gd2Ugd2lsbCBwZXJmb3JtIGNvbXB1dGF0aW9ucyBpbiBjaHVua3Mgb2YgMTAwMDAuIG1lYW5pbmcgdGhhdCB3ZSB3aWxsIGRpc3BhdGNoIDEwMDAwIHRocmVhZHMgYXQgYSB0aW1lLlxuICAgICAgICBjb25zdCBudW1PZlRocmVhZHMgPSAxMDAwMDtcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNvbXBsZXhpdHkgb2YgdGhlIGFsZ29yaXRobSwgYXMgdGhlIDEwMCBpcyBsb3cgZW5hdWdoIG51bWJlciwgd2hpY2ggaXMgbGltaXRlZCBieSBtZW1vcnkgdXNhZ2UuXG4gICAgICAgIGNvbnN0IHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgPSAxMDA7IC8vIG51bWJlciBvZiBpdGVyYXRpb25zIHBlciB0aHJlYWQgKG51bWJlciBvZiBwYWlyIGNvbXBhcmlzb25zKVxuICAgICAgICBjb25zdCBjb21iaW5lZENvbXBsZXhpdHkgPSBwcm9jZXNzSW5mby5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLmNvbXBsZXhpdHksIDApOyAvLyBjb21iaW5lZCBjb21wbGV4aXR5IG9mIGFsbCB0aGUgY29sdW1uc1xuICAgICAgICBjb25zdCBtYXhJdGVyYXRpb25zUGVyVGhyZWFkID0gTWF0aC5jZWlsKDEwMDAwIC8gY29tYmluZWRDb21wbGV4aXR5KTsgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXIgdGhyZWFkXG4gICAgICAgIGNvbnN0IHdvcmtHcm91cERpdmlzaW9uID0gMTA7IC8vIGhvdyBtYW55IHRocmVhZHMgaW5zaWRlIG9mIG9uZSB3b3JrZ3JvdXAgZGltZW5zaW9uIChpbiB0aGlzIGNhc2UgMTAgKiAxMCB0aHJlYWRzIHBlciB3b3JrZ3JvdXApXG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJXb3JrZ3JvdXAgPSB3b3JrR3JvdXBEaXZpc2lvbiAqIHdvcmtHcm91cERpdmlzaW9uO1xuICAgICAgICBjb25zdCB3b3JrZ3JvdXBzRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChNYXRoLmNlaWwobnVtT2ZUaHJlYWRzIC8gdGhyZWFkc1Blcldvcmtncm91cCkpKTsgLy8gaG93IG1hbnkgd29ya2dyb3VwcyBwZXIgMmQgZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGdsb2JhbFRocmVhZERpbVNpemUgPSB3b3JrZ3JvdXBzRGltICogd29ya0dyb3VwRGl2aXNpb247IC8vIGhvdyBtYW55IHRocmVhZHMgcGVyIDJkIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgPSBsaXN0U2l6ZSAqIChsaXN0U2l6ZSAtIDEpIC8gMjsgLy8gc2l6ZSBvZiB0aGUgY29uZGVuc2VkIGRpc3RhbmNlIG1hdHJpeCwgdGhpcyBtYW55IGNvbXBhcmlzb25zIHdpbGwgYmUgbWFkZS5cbiAgICAgICAgY29uc3QgZG1DaHVua1NpemVQZXJUaHJlYWQgPSBNYXRoLmNlaWwoY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC8gbnVtT2ZUaHJlYWRzKTsgLy8gaG93IG1hbnkgY29tcGFyaXNvbnMgcGVyIHRocmVhZFxuICAgICAgICBjb25zdCBtb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgICAgICAgIGxhYmVsOiAnU3BhcnNlIG1hdHJpeCBjb21wdXRlIHNoYWRlcicsXG4gICAgICAgICAgICBjb2RlOiBgXG4gICAgLy8gZWFjaCB0aHJlYWQgd2lsbCBwZXJmb3JtICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0gaXRlcmF0aW9ucyBhdCBvbmUgdGltZSwgY29tcGFyaW5nICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0gcGFpcnMgb2YgZW50cmllcy5cbiAgICAvLyBpbiB0b3RhbCwgZWFjaCB0aHJlYWQgd2lsbCBwZXJmb3JtIGF0IG1vc3QgJHtkbUNodW5rU2l6ZVBlclRocmVhZH0gY29tcGFyaXNvbnMuXG4gICAgLy8gZmlyc3QgaXMgdGhlIHJlc3VsdCBzdHJ1Y3QsIGNvbnRhaW5pbmcgaXMsIGpzLCBhbmQgZGlzdGFuY2VzLiBlYWNoIGFycmF5IHdpdGggbGVuZ3RoIG9mICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0sXG4gICAgLy8gYW5kIGFsc28gaW50ZWdlciBmb3IgaG93IG1hbnkgcGFpcnMgd2VyZSBmb3VuZCB0byBiZSBiZWxvdyB0aHJlc2hvbGQuXG4gICAgc3RydWN0IFNwYXJzZVJlc3VsdCB7XG4gICAgICBpOiBhcnJheTxhcnJheTx1MzIsICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0+LCAke251bU9mVGhyZWFkc30+LFxuICAgICAgajogYXJyYXk8YXJyYXk8dTMyLCAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9PiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGRpc3RhbmNlczogYXJyYXk8YXJyYXk8ZjMyLCAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9PiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGZvdW5kOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBkb25lOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT5cbiAgICB9XG4gICAgLy8gc3RydWN0IGZvciB0aGUgZGF0YVxuICAgIHN0cnVjdCBDb21wdXRlSW5mbyB7XG4gICAgICAvLyBzdGFydCBhdCBjb2xzIGFuZCByb3dzLCBhbmQgZW5kIGF0IGNvbHMgYW5kIHJvd3MgZm9yIGVhY2ggdGhyZWFkLCB0aGVzZSB3aWxsIGJlIGNhbGN1bGF0ZWQgb24gY3B1IGFuZCBwYXNzZWQgdG8gZ3B1LlxuICAgICAgc3RhcnRBdENvbHM6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIHN0YXJ0QXRSb3dzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBlbmRBdENvbHM6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGVuZEF0Um93czogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuXG4gICAgICAvLyB0aGUgQUNUVUFMTFkgc2l6ZXMgb2YgZWFjaCBlbnRyeVxuICAgICAgZW50cnlTaXplczogYXJyYXk8YXJyYXk8dTMyLCAke2xpc3RTaXplfT4sICR7bnVtT2ZDb2x1bW5zfT4sXG4gICAgICAvLyB0aGUgd2VpZ2h0cyBmb3IgZWFjaCBlbnRyeVxuICAgICAgd2VpZ2h0czogYXJyYXk8ZjMyLCAke251bU9mQ29sdW1uc30+LFxuICAgICAgLy8gdGhlIGRhdGEgZm9yIGVhY2ggZW50cnlcbiAgICAgICR7ZGF0YVdnc2x9IC8vIGFuIGV4YW1wbGUgb2YgdGhlIGRhdGFXZ3NsIHdvdWxkIGJlOlxuICAgICAgLy9kYXRhMDogYXJyYXk8YXJyYXk8dTMyLDIwPiwxMDA+LFxuICAgICAgLy9kYXRhMTogYXJyYXk8YXJyYXk8dTMyLDIwPiwxMDA+XG4gICAgfVxuXG4gICAgLy8gc3RydWN0IGZvciB0aGUgc3VwcGxlbWVudGFyeSBpbmZvcm1hdGlvblxuICAgIHN0cnVjdCBTdXBwSW5mbyB7XG4gICAgICAvLyBzdHJ1Y3QgY29udGFpbmluZyBhbGwgdGhlIHN1cHBsZW1lbnRhcnkgaW5mbywgbGlrZSBzY29yaW5nIG1hdHJpeCwgYWxwaGFiZXQgaW5kZXhlcywgcmFuZ2UsIGV0Yy5cbiAgICAgICR7c3VwcEluZm9XZ3NsfVxuICAgIH07XG5cbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IGNvbXB1dGVJbmZvOiBDb21wdXRlSW5mbztcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMSkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IHN1cHBJbmZvOiBTdXBwSW5mbztcbiAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMikgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IHJlc3VsdHM6IFNwYXJzZVJlc3VsdDtcbiAgICBAY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoJHt3b3JrR3JvdXBEaXZpc2lvbn0sICR7d29ya0dyb3VwRGl2aXNpb259KSBmbiBjYWxjU3BhcnNlTWF0cml4KFxuICAgICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGlkOiB2ZWMzPHUzMj5cbiAgICApIHtcbiAgICAgICR7bmVlZHNEdW1teSA/IGBsZXQgb3RoZXJEdW1teSA9IHN1cHBJbmZvLmR1bW15ICogMjtgIDogJyd9IC8vIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN1cHBJbmZvIGlzIG5vdCBvcHRpbWl6ZWQgb3V0XG4gICAgICBsZXQgdGhyZWFkQ29sID0gaWQueDtcbiAgICAgIGxldCB0aHJlYWRSb3cgPSBpZC55O1xuICAgICAgbGV0IGxpbmVhckluZGV4ID0gdGhyZWFkUm93ICogJHtnbG9iYWxUaHJlYWREaW1TaXplfSArIHRocmVhZENvbDtcbiAgICAgIGlmIChsaW5lYXJJbmRleCA+PSAke251bU9mVGhyZWFkc30pIHtcbiAgICAgICAgcmV0dXJuOyAvLyBpZiB3ZSBhcmUgb3V0IG9mIGJvdW5kcywgcmV0dXJuXG4gICAgICB9ICAgICAgXG4gICAgICB2YXIgc3RhcnRBdENvbDogdTMyID0gY29tcHV0ZUluZm8uc3RhcnRBdENvbHNbbGluZWFySW5kZXhdO1xuICAgICAgdmFyIHN0YXJ0QXRSb3c6IHUzMiA9IGNvbXB1dGVJbmZvLnN0YXJ0QXRSb3dzW2xpbmVhckluZGV4XTtcbiAgICAgIGxldCBlbmRBdENvbDogdTMyID0gbWluKGNvbXB1dGVJbmZvLmVuZEF0Q29sc1tsaW5lYXJJbmRleF0sICR7bGlzdFNpemV9dSk7XG4gICAgICBsZXQgZW5kQXRSb3c6IHUzMiA9IG1pbihjb21wdXRlSW5mby5lbmRBdFJvd3NbbGluZWFySW5kZXhdLCAke2xpc3RTaXplfXUpO1xuICAgICAgbGV0IGlzID0gJnJlc3VsdHMuaVtsaW5lYXJJbmRleF07XG4gICAgICBsZXQganMgPSAmcmVzdWx0cy5qW2xpbmVhckluZGV4XTtcbiAgICAgIGxldCBkaXN0YW5jZXMgPSAmcmVzdWx0cy5kaXN0YW5jZXNbbGluZWFySW5kZXhdO1xuICAgICAgcmVzdWx0cy5mb3VuZFtsaW5lYXJJbmRleF0gPSAwOyAvLyBpbml0aWFsaXplIHRoZSBmb3VuZCBjb3VudGVyXG4gICAgICB2YXIgZm91bmQ6IHUzMiA9IDA7XG4gICAgICBpZiAocmVzdWx0cy5kb25lW2xpbmVhckluZGV4XSA+IDApIHtcbiAgICAgICAgcmV0dXJuOyAvLyBpZiB3ZSBhcmUgZG9uZSwgcmV0dXJuXG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICR7bWF4SXRlcmF0aW9uc1BlclRocmVhZH07IGkrKykge1xuICAgICAgICBpZiAoc3RhcnRBdENvbCA+PSBlbmRBdENvbCAmJiBzdGFydEF0Um93ID49IGVuZEF0Um93KSB7XG4gICAgICAgICAgcmVzdWx0cy5kb25lW2xpbmVhckluZGV4XSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kID49ICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlzdCA9IGNvbWJpbmVkRGlzdGFuY2Uoc3RhcnRBdENvbCwgc3RhcnRBdFJvdyk7XG4gICAgICAgIGlmIChkaXN0IDw9ICR7bWF4RGlzdGFuY2V9KSB7XG4gICAgICAgICAgKCppcylbZm91bmRdID0gc3RhcnRBdENvbDtcbiAgICAgICAgICAoKmpzKVtmb3VuZF0gPSBzdGFydEF0Um93O1xuICAgICAgICAgICgqZGlzdGFuY2VzKVtmb3VuZF0gPSBkaXN0O1xuICAgICAgICAgIGZvdW5kID0gZm91bmQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0QXRDb2wgPSBzdGFydEF0Q29sICsgMTtcbiAgICAgICAgaWYgKHN0YXJ0QXRDb2wgPj0gJHtsaXN0U2l6ZX11KSB7XG4gICAgICAgICAgc3RhcnRBdFJvdyArPSAxO1xuICAgICAgICAgIHN0YXJ0QXRDb2wgPSBzdGFydEF0Um93ICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0cy5mb3VuZFtsaW5lYXJJbmRleF0gPSBmb3VuZDtcbiAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhcnRBdENvbHMgYW5kIHN0YXJ0QXRSb3dzXG4gICAgICBjb21wdXRlSW5mby5zdGFydEF0Q29sc1tsaW5lYXJJbmRleF0gPSBzdGFydEF0Q29sO1xuICAgICAgY29tcHV0ZUluZm8uc3RhcnRBdFJvd3NbbGluZWFySW5kZXhdID0gc3RhcnRBdFJvdztcblxuICAgIH1cblxuICAgIC8vIHRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgZGlzdGFuY2Ugc2NyaXB0IGZvciBlYWNoIGRpc3RhbmNlIG1ldHJpYyBhbmQgdGhlbiBjb21iaW5lIHRoZW0gaW50byBvbmVcbiAgICAke2dldENvbWJpbmVkRGlzdGFuY2VTY3JpcHQoZGlzdGFuY2VNZXRyaWNzLCBwcm9jZXNzSW5mby5tYXAoKGluZm8pID0+IGluZm8ubWF4RW50cnlMZW4pLCBtYXhEaXN0YW5jZSwgYWdncmVnYXRpb25GdW5jdGlvbil9XG5cblxuICAgIGBcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSh7XG4gICAgICAgICAgICBsYWJlbDogJ3NwYXJzZSBtYXRyaXggY29tcHV0ZSBwaXBlbGluZScsXG4gICAgICAgICAgICBsYXlvdXQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXB1dGU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICAgICAgZW50cnlQb2ludDogJ2NhbGNTcGFyc2VNYXRyaXgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdlbmVyYXRlIHN0YXJ0QXRDb2xzLCBzdGFydEF0Um93cywgZW5kQXRDb2xzLCBlbmRBdFJvd3NcbiAgICAgICAgY29uc3Qgc3RhcnRBdENvbHMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgc3RhcnRBdFJvd3MgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3QgZW5kQXRDb2xzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IGVuZEF0Um93cyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAvIG51bU9mVGhyZWFkcyk7IC8vIHNpemUgb2YgdGhlIGNodW5rIHBlciB0aHJlYWQgKGluIHRvdGFsKVxuICAgICAgICBsZXQgc3RhcnRSb3cgPSAwO1xuICAgICAgICBsZXQgc3RhcnRDb2wgPSAxO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ0dQVXRocmVhZFN0YXJ0cycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9mVGhyZWFkczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJZHggPSBpID09PSBudW1PZlRocmVhZHMgLSAxID8gY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC0gMSA6IChpICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgICAvLyBmYW5jeSBmb3JtdWxhcyB0byBjYWxjdWxhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgaW5kaWNlcyBmb3IgdGhlIGNvbmRlbnNlZCBkaXN0YW5jZSBtYXRyaXggZm9yIGVhY2ggdGhyZWFkIHN0YXJ0XG4gICAgICAgICAgICBjb25zdCBlbmRSb3cgPSBsaXN0U2l6ZSAtIDIgLSBNYXRoLmZsb29yKE1hdGguc3FydCgtOCAqIGVuZElkeCArIDQgKiBsaXN0U2l6ZSAqIChsaXN0U2l6ZSAtIDEpIC0gNykgLyAyIC0gMC41KTtcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbCA9IGVuZElkeCAtIGxpc3RTaXplICogZW5kUm93ICsgTWF0aC5mbG9vcigoZW5kUm93ICsgMSkgKiAoZW5kUm93ICsgMikgLyAyKTtcbiAgICAgICAgICAgIHN0YXJ0QXRDb2xzW2ldID0gc3RhcnRDb2w7XG4gICAgICAgICAgICBzdGFydEF0Um93c1tpXSA9IHN0YXJ0Um93O1xuICAgICAgICAgICAgZW5kQXRDb2xzW2ldID0gZW5kQ29sO1xuICAgICAgICAgICAgZW5kQXRSb3dzW2ldID0gZW5kUm93O1xuICAgICAgICAgICAgc3RhcnRSb3cgPSBlbmRSb3c7XG4gICAgICAgICAgICBzdGFydENvbCA9IGVuZENvbDtcbiAgICAgICAgICAgIC8vIGNvbnN0IHN0YXJ0Um93ID0gdmFsdWVzWzBdLmxlbmd0aCAtIDIgLSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgLy8gICBNYXRoLnNxcnQoLTggKiBzdGFydElkeCArIDQgKiB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAtIDcpIC8gMiAtIDAuNSk7XG4gICAgICAgICAgICAvLyBjb25zdCBzdGFydENvbCA9IHN0YXJ0SWR4IC0gdmFsdWVzWzBdLmxlbmd0aCAqIHN0YXJ0Um93ICsgTWF0aC5mbG9vcigoc3RhcnRSb3cgKyAxKSAqIChzdGFydFJvdyArIDIpIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdHUFV0aHJlYWRTdGFydHMnKTtcbiAgICAgICAgLy8gc2l6ZSBvZiB0aGUgY29tcHV0ZUluZm8gYnVmZmVyXG4gICAgICAgIGNvbnN0IGNvbXB1dGVJbmZvQnVmZmVyMzJTaXplID0gbnVtT2ZUaHJlYWRzICogNCArIC8vIHN0YXJ0QXRDb2xzLCBzdGFydEF0Um93cywgZW5kQXRDb2xzLCBlbmRBdFJvd3NcbiAgICAgICAgICAgIGxpc3RTaXplICogbnVtT2ZDb2x1bW5zICsgLy8gZW50cnlTaXplc1xuICAgICAgICAgICAgbnVtT2ZDb2x1bW5zICsgLy8gd2VpZ2h0c1xuICAgICAgICAgICAgcHJvY2Vzc0luZm8ucmVkdWNlKChhLCBiKSA9PiBhICsgYi5zb3VyY2VBcnJheVNpemUsIDApO1xuICAgICAgICAvLyBzaXplIG9mIHRoZSBzdXBwSW5mbyBidWZmZXJcbiAgICAgICAgY29uc3Qgc3VwcEluZm9CdWZmZXIzMlNpemUgPSBwcm9jZXNzSW5mby5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLnN1cHBJbmZvU2l6ZSwgMCk7XG4gICAgICAgIC8vIHNpemUgb2YgdGhlIHJlc3VsdHMgYnVmZmVyXG4gICAgICAgIGNvbnN0IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSA9IHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKiBudW1PZlRocmVhZHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdHNCdWZmZXIzMlNpemUgPSAzICogc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICsgbnVtT2ZUaHJlYWRzICsgbnVtT2ZUaHJlYWRzOyAvLyBpLCBqLCBkaXN0YW5jZXMsIGZvdW5kLCBkb25lXG4gICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvbiB0aGUgR1BVIHRvIGhvbGQgY29tcHV0ZUluZm9cbiAgICAgICAgLy8gYmV3YXJlIHRoYXQgc3RydWN0IG11c3QgYmUgcGFkZGVkIHRvIDE2IGJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0IGluIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBjb21wdXRlSW5mb0J1ZmZlclNpemUgPSBjb21wdXRlSW5mb0J1ZmZlcjMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBsZXQgcGFkZGVkQ29tcHV0ZUluZm9CdWZmZXJTaXplID0gY29tcHV0ZUluZm9CdWZmZXJTaXplO1xuICAgICAgICBjb25zdCByZW1haW5kZXIgPSBjb21wdXRlSW5mb0J1ZmZlclNpemUgJiAxNTsgLy8gY2hlY2sgaWYgdGhlIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNlxuICAgICAgICBpZiAocmVtYWluZGVyICE9PSAwKVxuICAgICAgICAgICAgcGFkZGVkQ29tcHV0ZUluZm9CdWZmZXJTaXplICs9IDE2IC0gcmVtYWluZGVyOyAvLyBwYWQgdGhlIHNpemUgYWNjb3JkaW5nbHlcbiAgICAgICAgY29uc3QgY29tcHV0ZUluZm9CdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnY29tcHV0ZSBpbmZvIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIgPSBjb21wdXRlSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpOyAvLyBnZXQgZnVsbCBidWZmZXJcbiAgICAgICAgLy8gZHluYW1pYyBvZmZzZXQgZm9yIHRoZSBjb21wdXRlSW5mbyBidWZmZXJcbiAgICAgICAgbGV0IGNvbXB1dGVJbmZvT2ZmU2V0ID0gMDtcbiAgICAgICAgLy8gZmlyc3Qgd3JpdGUgdGhlIHN0YXJ0QXRDb2xzLCBzdGFydEF0Um93cywgZW5kQXRDb2xzLCBlbmRBdFJvd3NcbiAgICAgICAgY29uc3Qgc3RhcnRBdENvbHNCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBzdGFydEF0Q29sc0J1ZmZlclZpZXcuc2V0KHN0YXJ0QXRDb2xzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBzdGFydEF0Um93c0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIHN0YXJ0QXRSb3dzQnVmZmVyVmlldy5zZXQoc3RhcnRBdFJvd3MpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGVuZEF0Q29sc0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGVuZEF0Q29sc0J1ZmZlclZpZXcuc2V0KGVuZEF0Q29scyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3QgZW5kQXRSb3dzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgZW5kQXRSb3dzQnVmZmVyVmlldy5zZXQoZW5kQXRSb3dzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICAvLyB0aGVuIHdyaXRlIHRoZSBlbnRyeVNpemVzXG4gICAgICAgIGNvbnN0IGVudHJ5U2l6ZXNWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBhcnJheVNpemVzLmxlbmd0aCk7XG4gICAgICAgIGVudHJ5U2l6ZXNWaWV3LnNldChhcnJheVNpemVzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gYXJyYXlTaXplcy5sZW5ndGggKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIC8vIHRoZW4gd3JpdGUgdGhlIHdlaWdodHNcbiAgICAgICAgY29uc3Qgd2VpZ2h0c1ZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZkNvbHVtbnMpO1xuICAgICAgICB3ZWlnaHRzVmlldy5zZXQod2VpZ2h0cyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mQ29sdW1ucyAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIGRhdGEgaXRzZWxmXG4gICAgICAgIGZvciAoY29uc3QgaW5mbyBvZiBwcm9jZXNzSW5mbykge1xuICAgICAgICAgICAgY29uc3QgQXJyYXlDb25zdHJ1Y3RvciA9IGluZm8uRW5jb2RlZEFycmF5Q29uc3RydWN0b3I7XG4gICAgICAgICAgICBjb25zdCBjaHVua1NpemUgPSBpbmZvLnNvdXJjZUFycmF5U2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IEFycmF5Q29uc3RydWN0b3IobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIGNodW5rU2l6ZSk7IC8vbmV3IEFycmF5Q29uc3RydWN0b3IoY29tcHV0ZUluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoY29tcHV0ZUluZm9PZmZTZXQsIGNodW5rQnl0ZVNpemUpKTtcbiAgICAgICAgICAgIGRhdGFWaWV3LnNldChpbmZvLmZsYXRTb3VyY2VBcnJheSk7XG4gICAgICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBjaHVua1NpemUgKiBBcnJheUNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlIGFyZSBkb25lIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGNvbXB1dGVJbmZvQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvbiB0aGUgR1BVIHRvIGhvbGQgc3VwcEluZm9cbiAgICAgICAgLy8gc2FtZSBoZXJlLCB3ZSBuZWVkIHRvIHBhZCB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0IHRvIDE2IGJ5dGVzXG4gICAgICAgIGNvbnN0IHN1cHBJbmZvQnVmZmVyU2l6ZSA9IHN1cHBJbmZvQnVmZmVyMzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGxldCBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUgPSBzdXBwSW5mb0J1ZmZlclNpemU7XG4gICAgICAgIGNvbnN0IHN1cHBJbmZvUmVtYWluZGVyID0gc3VwcEluZm9CdWZmZXJTaXplICYgMTU7IC8vIGNoZWNrIGlmIHRoZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTZcbiAgICAgICAgaWYgKHN1cHBJbmZvUmVtYWluZGVyICE9PSAwKVxuICAgICAgICAgICAgcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplICs9IDE2IC0gc3VwcEluZm9SZW1haW5kZXI7IC8vIHBhZCB0aGUgc2l6ZSBhY2NvcmRpbmdseVxuICAgICAgICBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUgPSBNYXRoLm1heChwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUsIDE2KTtcbiAgICAgICAgY29uc3Qgc3VwcEluZm9CdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3VwcCBpbmZvIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIgPSBzdXBwSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpOyAvLyBnZXQgZnVsbCBidWZmZXJcbiAgICAgICAgbGV0IHN1cHBJbmZvT2ZmU2V0ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpbmZvIG9mIHByb2Nlc3NJbmZvKSB7XG4gICAgICAgICAgICBpZiAoaW5mby5zdXBwSW5mb0J1ZmZlciAmJiBpbmZvLnN1cHBJbmZvQnVmZmVyLmJ5dGVMZW5ndGggPiAwICYmIGluZm8uc3VwcEluZm9TaXplID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5Q29uc3RydWN0b3IgPSBpbmZvLnN1cHBJbmZvVHlwZSA9PT0gXCJVSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuVUlOVDMyQVJSQVkgKi8gPyBVaW50MzJBcnJheSA6IEZsb2F0MzJBcnJheTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdXBwSW5mb1ZpZXcgPSBuZXcgQXJyYXlDb25zdHJ1Y3RvcihtYXBwZWRTdXBwSW5mb0FycmF5QnVmZmVyLCBzdXBwSW5mb09mZlNldCwgaW5mby5zdXBwSW5mb0J1ZmZlci5sZW5ndGgpOyAvL25ldyBBcnJheUNvbnN0cnVjdG9yKHN1cHBJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKHN1cHBJbmZvT2ZmU2V0LCBpbmZvLnN1cHBJbmZvQnVmZmVyLmJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBzdXBwSW5mb1ZpZXcuc2V0KGluZm8uc3VwcEluZm9CdWZmZXIpO1xuICAgICAgICAgICAgICAgIHN1cHBJbmZvT2ZmU2V0ICs9IGluZm8uc3VwcEluZm9CdWZmZXIuYnl0ZUxlbmd0aDsgLy8gaW5mby5zdXBwSW5mb0J1ZmZlci5sZW5ndGggKiBBcnJheUNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdXBwSW5mb09mZlNldCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZHVtbXlWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIsIDAsIDQpOyAvL25ldyBVaW50MzJBcnJheShzdXBwSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgwLCAxNikpO1xuICAgICAgICAgICAgZHVtbXlWaWV3LnNldChbMSwgMSwgMSwgMV0pO1xuICAgICAgICB9XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdHNcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlclNpemUgPSByZXN1bHRzQnVmZmVyMzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGxldCBwYWRkZWRSZXN1bHRzQnVmZmVyU2l6ZSA9IHJlc3VsdHNCdWZmZXJTaXplO1xuICAgICAgICBjb25zdCByZXN1bHRzUmVtYWluZGVyID0gcmVzdWx0c0J1ZmZlclNpemUgJiAxNTsgLy8gY2hlY2sgaWYgdGhlIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNlxuICAgICAgICBpZiAocmVzdWx0c1JlbWFpbmRlciAhPT0gMClcbiAgICAgICAgICAgIHBhZGRlZFJlc3VsdHNCdWZmZXJTaXplICs9IDE2IC0gcmVzdWx0c1JlbWFpbmRlcjsgLy8gcGFkIHRoZSBzaXplIGFjY29yZGluZ2x5XG4gICAgICAgIGNvbnN0IHJlc3VsdHNCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAncmVzdWx0cyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcGFkZGVkUmVzdWx0c0J1ZmZlclNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkNcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNldHVwIGEgYmluZEdyb3VwIHRvIHRlbGwgdGhlIHNoYWRlciB3aGljaFxuICAgICAgICAvLyBidWZmZXIgdG8gdXNlIGZvciB0aGUgY29tcHV0YXRpb25cbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYWJlbDogJ2JpbmRHcm91cCBmb3Igc3BhcnNlIG1hdHJpeCBidWZmZXInLFxuICAgICAgICAgICAgbGF5b3V0OiBwaXBlbGluZS5nZXRCaW5kR3JvdXBMYXlvdXQoMCksXG4gICAgICAgICAgICBlbnRyaWVzOiBbXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAwLCByZXNvdXJjZTogeyBidWZmZXI6IGNvbXB1dGVJbmZvQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDEsIHJlc291cmNlOiB7IGJ1ZmZlcjogc3VwcEluZm9CdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMiwgcmVzb3VyY2U6IHsgYnVmZmVyOiByZXN1bHRzQnVmZmVyIH0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICAvL2NvbnN0IHBhaXJDb21wYXJpc29uc1BlclBhc3MgPSBtYXhJdGVyYXRpb25zUGVyVGhyZWFkICogbnVtT2ZUaHJlYWRzO1xuICAgICAgICAvL2NvbnN0IHBhc3NlcyA9IE1hdGguY2VpbChjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLyBwYWlyQ29tcGFyaXNvbnNQZXJQYXNzKTtcbiAgICAgICAgLy8gd2Ugd2lsbCBkaXN0cGF0Y2ggdGhpcyBtYW55IHBhc3NlcyB0byB0aGUgR1BVLCBhbmQgaXQgd2lsbCBoYW5kbGUgaW5kZXhlcyBhbGwgYnkgaXRzZWxmLlxuICAgICAgICAvLyB3ZSBhbHJlYWR5IGNvcGllZCB0aGUgc3RhcnQvZW5kIGluZm9ybWF0aW9uIHRvIGl0LCBzbyBpdCB3aWxsIGtub3cgd2hlcmUgdG8gc3RhcnQgYW5kIGVuZCBvbiBlYWNoIHBhc3MuXG4gICAgICAgIGNvbnN0IHJlc3VsdHNPdXRCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAncmVzdWx0cyBvdXQgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHJlc3VsdHNCdWZmZXIuc2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRCB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0SXMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0SnMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0RGlzdGFuY2VzID0gW107XG4gICAgICAgIC8vbGV0IGNvbWJpbmVkRm91bmQgPSAwO1xuICAgICAgICBsZXQgaXNBbGxEb25lID0gZmFsc2U7XG4gICAgICAgIHdoaWxlICghaXNBbGxEb25lKSB7XG4gICAgICAgICAgICAvLyBFbmNvZGUgY29tbWFuZHMgdG8gZG8gdGhlIGNvbXB1dGF0aW9uXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2Rpc3RhbmNlIGVuY29kZXInLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBwYXNzID0gZW5jb2Rlci5iZWdpbkNvbXB1dGVQYXNzKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2Rpc3RhbmNlIGNvbXB1dGUgcGFzcycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhc3Muc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICAgICAgcGFzcy5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgICAgIHBhc3MuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtncm91cHNEaW0sIHdvcmtncm91cHNEaW0pO1xuICAgICAgICAgICAgcGFzcy5lbmQoKTtcbiAgICAgICAgICAgIGVuY29kZXIuY29weUJ1ZmZlclRvQnVmZmVyKHJlc3VsdHNCdWZmZXIsIDAsIHJlc3VsdHNPdXRCdWZmZXIsIDAsIHJlc3VsdHNPdXRCdWZmZXIuc2l6ZSk7XG4gICAgICAgICAgICAvLyBGaW5pc2ggZW5jb2RpbmcgYW5kIHN1Ym1pdCB0aGUgY29tbWFuZHNcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRCdWZmZXIgPSBlbmNvZGVyLmZpbmlzaCgpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLnN1Ym1pdChbY29tbWFuZEJ1ZmZlcl0pO1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzdWx0c1xuICAgICAgICAgICAgeWllbGQgZGV2aWNlLnF1ZXVlLm9uU3VibWl0dGVkV29ya0RvbmUoKTtcbiAgICAgICAgICAgIHlpZWxkIHJlc3VsdHNPdXRCdWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNPdXRBcnJheUJ1ZmZlciA9IHJlc3VsdHNPdXRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcbiAgICAgICAgICAgIC8vIHJlYWQgdGhlIHJlc3VsdHNcbiAgICAgICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0kgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzSiA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSAqIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNGb3VuZCA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNEb25lID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICAgICAgaXNBbGxEb25lID0gcmVzdWx0c0RvbmUuZXZlcnkoKGQpID0+IGQgPT09IDEpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxSZXN1bHRzID0gcmVzdWx0c0ZvdW5kLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgICAgICAgY29uc3QgY29tYmluZWRJID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsUmVzdWx0cyk7XG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZEogPSBuZXcgVWludDMyQXJyYXkodG90YWxSZXN1bHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbFJlc3VsdHMpO1xuICAgICAgICAgICAgbGV0IGNvbWJpbmVkT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHJlc0kgPSAwOyByZXNJIDwgcmVzdWx0c0ZvdW5kLmxlbmd0aDsgcmVzSSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSByZXN1bHRzRm91bmRbcmVzSV07XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZEkuc2V0KHJlc3VsdHNJLnN1YmFycmF5KHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkLCByZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCArIGZvdW5kKSwgY29tYmluZWRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkSi5zZXQocmVzdWx0c0ouc3ViYXJyYXkocmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQsIHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICsgZm91bmQpLCBjb21iaW5lZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29tYmluZWREaXN0YW5jZXMuc2V0KHJlc3VsdHNEaXN0YW5jZXMuc3ViYXJyYXkocmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQsIHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICsgZm91bmQpLCBjb21iaW5lZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29tYmluZWRPZmZzZXQgKz0gZm91bmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRJcy5wdXNoKGNvbWJpbmVkSSk7XG4gICAgICAgICAgICByZXN1bHRKcy5wdXNoKGNvbWJpbmVkSik7XG4gICAgICAgICAgICByZXN1bHREaXN0YW5jZXMucHVzaChjb21iaW5lZERpc3RhbmNlcyk7XG4gICAgICAgICAgICByZXN1bHRzT3V0QnVmZmVyLnVubWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWxTaXplID0gcmVzdWx0SXMucmVkdWNlKChhLCBiKSA9PiBhICsgYi5sZW5ndGgsIDApO1xuICAgICAgICBjb25zdCBmaW5hbEkgPSBuZXcgVWludDMyQXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgY29uc3QgZmluYWxKID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICBsZXQgZmluYWxPZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdElzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmaW5hbEkuc2V0KHJlc3VsdElzW2ldLCBmaW5hbE9mZnNldCk7XG4gICAgICAgICAgICBmaW5hbEouc2V0KHJlc3VsdEpzW2ldLCBmaW5hbE9mZnNldCk7XG4gICAgICAgICAgICBmaW5hbERpc3RhbmNlcy5zZXQocmVzdWx0RGlzdGFuY2VzW2ldLCBmaW5hbE9mZnNldCk7XG4gICAgICAgICAgICBmaW5hbE9mZnNldCArPSByZXN1bHRJc1tpXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXMgcnVsZSBtYW5kYXRlcywgZGVzdHJveSBhbGwgYnVmZmVycy5cbiAgICAgICAgY29tcHV0ZUluZm9CdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJlc3VsdHNCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXN1bHRzT3V0QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHsgaTogZmluYWxJLCBqOiBmaW5hbEosIGRpc3RhbmNlOiBmaW5hbERpc3RhbmNlcyB9O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0Q29tYmluZWREaXN0YW5jZVNjcmlwdChkaXN0YW5jZU1ldHJpY3MsIG1heEVudHJ5TGVucywgbWF4RGlzdGFuY2UsIGFnZ3JlZ2F0aW9uKSB7XG4gICAgY29uc3QgZGlzdGFuY2VXZ3NscyA9IGRpc3RhbmNlTWV0cmljcy5tYXAoKG1ldHJpYywgaSkgPT4ge1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICBmbiBkaXN0YW5jZVNjcmlwdCR7aX0oYUluZGV4OiB1MzIsIGJJbmRleDogdTMyKSAtPiBmMzIge1xuICAgICAgICAgIGxldCBhID0gY29tcHV0ZUluZm8uZGF0YSR7aX1bYUluZGV4XTtcbiAgICAgICAgICBsZXQgYiA9IGNvbXB1dGVJbmZvLmRhdGEke2l9W2JJbmRleF07XG4gICAgICAgICAgbGV0IG1heERpc3RhbmNlOiBmMzIgPSAke21heERpc3RhbmNlfTtcbiAgICAgICAgICAke3dlYkdQVUZ1bmN0aW9uc1ttZXRyaWNdKG1heEVudHJ5TGVuc1tpXSwgaSl9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSk7XG4gICAgY29uc3QgYWxsRGlzdGFuY2VTY3JpcHRzID0gZGlzdGFuY2VXZ3Nscy5qb2luKCdcXG4nKTtcbiAgICBjb25zdCBjb21iaW5lRGlzdGFuY2VzU2NyaXB0ID0gYFxuICAgICAgZm4gY29tYmluZWREaXN0YW5jZShhSW5kZXg6IHUzMiwgYkluZGV4OiB1MzIpIC0+IGYzMiB7XG4gICAgICAgIHZhciBkaXN0YW5jZXM6IGFycmF5PGYzMiwgJHtkaXN0YW5jZU1ldHJpY3MubGVuZ3RofT47XG4gICAgICAgICR7ZGlzdGFuY2VNZXRyaWNzLm1hcCgoXywgaSkgPT4gYGRpc3RhbmNlc1ske2l9XSA9IGRpc3RhbmNlU2NyaXB0JHtpfShhSW5kZXgsIGJJbmRleCk7YCkuam9pbignXFxuJyl9XG4gICAgICAgICR7V0VCR1NMQUdHUkVHQVRJT05GVU5DVElPTlNbYWdncmVnYXRpb25dKGRpc3RhbmNlTWV0cmljcy5sZW5ndGgpfVxuICAgICAgfVxuICAgIFxuICAgIGA7XG4gICAgcmV0dXJuIGFsbERpc3RhbmNlU2NyaXB0cyArICdcXG4nICsgY29tYmluZURpc3RhbmNlc1NjcmlwdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1zcGFyc2UtbWF0cml4LmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCB7IGRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5LCBUeXBlU3VwcG9ydGVkRGlzdGFuY2VzLCBXRUJHUFVESVNUQU5DRSB9IGZyb20gJy4uL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcyc7XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVUHJvY2Vzc0luZm8oZW50cnlMaXN0LCBkaXN0YW5jZU1ldHJpYyA9IFdFQkdQVURJU1RBTkNFLkhBTU1JTkcsIGVudHJ5SW5kZXgsIC8vIGluZGV4IG9mIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IG9mIGxpc3RzIHRoYXQgd2Ugd2FudCB0byBwcm9jZXNzXG5vcHRpb25zID0geyBnYXBPcGVuUGVuYWx0eTogMS4wLCBnYXBFeHRlbnNpb25QZW5hbHR5OiAwLjYgfSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IGVudHJ5VHlwZSA9IG51bGw7XG4gICAgY29uc3QgZW5jb2RlZExpc3QgPSAoKCkgPT4ge1xuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IHR5cGVvZiBlID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiU1RSSU5HXCIgLyogV0dQVUVOVFJZVFlQRS5TVFJJTkcgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0Lm1hcCgoZW50cnkpID0+IG5ldyBVaW50MzJBcnJheShlbnRyeS5zcGxpdCgnJykubWFwKChjKSA9PiBjLmNoYXJDb2RlQXQoMCkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiB0eXBlb2YgZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIk5VTUJFUlwiIC8qIFdHUFVFTlRSWVRZUEUuTlVNQkVSICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdC5tYXAoKGVudHJ5KSA9PiBuZXcgRmxvYXQzMkFycmF5KFtlbnRyeV0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVudHJ5TGlzdFswXSA9PSAnb2JqZWN0JyAmJiBlbnRyeUxpc3Quc29tZSgoZSkgPT4gJ19kYXRhJyBpbiBlICYmICdfbGVuZ3RoJyBpbiBlKSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJCSVRBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuQklUQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0Lm1hcCgoZW50cnkpID0+IGVudHJ5Ll9kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IGUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IGUgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IGUgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdDtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBlbnRyeUxpc3QgYXMgVWludDMyQXJyYXlbXTtcbiAgICB9KSgpO1xuICAgIGlmICghZW5jb2RlZExpc3QgfHwgIWVudHJ5VHlwZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVudHJ5IHR5cGUsIGNvdWxkIG5vdCBkZXRlcm1pbmUgZW50cnkgdHlwZSBmcm9tIGlucHV0IGxpc3QnKTtcbiAgICBjb25zdCBlbmNvZGVkTGlzdFR5cGUgPSBlbmNvZGVkTGlzdFswXSBpbnN0YW5jZW9mIEludDMyQXJyYXkgPyBcIklOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLklOVDMyQVJSQVkgKi8gOlxuICAgICAgICBlbmNvZGVkTGlzdFswXSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSA/IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi8gOiBcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqLztcbiAgICAvLyBzaXplcyBvZiBlYWNoIGVudHJpZXMgbWlnaHQgZGlmZmVyLCBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhhdCBmb3Igc29tZSBkaXN0YW5jZSBtZXRyaWNzLCBsaWtlIGhhbW1pbmcgZm9yIGV4YW1wbGVcbiAgICBjb25zdCBhcnJheVNpemVzID0gbmV3IFVpbnQzMkFycmF5KGVuY29kZWRMaXN0Lm1hcCgoYXJyKSA9PiBhcnIubGVuZ3RoKSk7XG4gICAgaWYgKCFUeXBlU3VwcG9ydGVkRGlzdGFuY2VzW2VudHJ5VHlwZV0gfHwgIVR5cGVTdXBwb3J0ZWREaXN0YW5jZXNbZW50cnlUeXBlXS5oYXMoZGlzdGFuY2VNZXRyaWMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc3RhbmNlIG1ldHJpYyAnJHtkaXN0YW5jZU1ldHJpY30nIG5vdCBzdXBwb3J0ZWQgZm9yIGVudHJ5IHR5cGUgJyR7ZW50cnlUeXBlfSdgKTtcbiAgICBjb25zdCBtYXhFbnRyeUxlbiA9IGFycmF5U2l6ZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCk7XG4gICAgLy8gZ2V0IHRoZSBjb21wbGV4aXR5IG9mIHVzZWQgYWxnb3JpdGhtXG4gICAgY29uc3QgY29tcGxleGl0eSA9IGRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5W2Rpc3RhbmNlTWV0cmljXShtYXhFbnRyeUxlbik7XG4gICAgY29uc3QgRW5jb2RlZEFycmF5Q29uc3RydWN0b3IgPSBlbmNvZGVkTGlzdFR5cGUgPT09IFwiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqLyA/IEludDMyQXJyYXkgOlxuICAgICAgICAoZW5jb2RlZExpc3RUeXBlID09PSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovID8gRmxvYXQzMkFycmF5IDogVWludDMyQXJyYXkpO1xuICAgIGNvbnN0IGZsYXRTb3VyY2VBcnJheSA9IG5ldyBFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvcihlbmNvZGVkTGlzdC5sZW5ndGggKiBtYXhFbnRyeUxlbik7XG4gICAgLy8gd2hlbiBzZXR0aW5nLCB3ZSBuZWVkIHRvIHNldCBlYWNoIGFycmF5IGF0IGEgc3BlY2lmaWMgb2Zmc2V0LCB3aGljaCBpcyBjb250cm9sbGVkIGJ5IG1heEFycmF5TGVuIGJlY2F1c2UgZWFjaCBhcnJheSBtaWdodCBoYXZlIGRpZmZlcmVudCBzaXplcy5cbiAgICAvLyB0aGlzIHdheSB3ZSB3aWxsIGdldCBjb3JyZWN0IG1hdHJpeCByZXByZXNlbnRhdGlvbiBpbiB0aGUgY29tcHV0ZSBzaGFkZXJcbiAgICBlbmNvZGVkTGlzdC5mb3JFYWNoKChzZXEsIGkpID0+IHtcbiAgICAgICAgZmxhdFNvdXJjZUFycmF5LnNldChzZXEsIGkgKiBtYXhFbnRyeUxlbik7XG4gICAgfSk7XG4gICAgLy8gTkIhIGFsbCB0aGlzIGJlZm9yZSB0aGUgbGluZSB3YXMgZ2VuZXJpYywgbm93IHdlIG5lZWQgdG8gY2FsY3VsYXRlIHNvbWUgc3BlY2lmaWMgdGhpbmdzIGZvciBzb21lIHNwZWNpZmljIGRpc3RhbmNlIG1ldHJpY3NcbiAgICAvLyBpbml0aWFsaXplIHN1cHAgaW5mbyBsaW5lIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgc2hhZGVyO1xuICAgIGxldCBzdXBwSW5mb1N0cnVjdFdnc2wgPSAnJzsgLy8gdGhlIGNvZGUgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBzdHJ1Y3Qgb2Ygc3VwcEluZm9cbiAgICBsZXQgc3VwcEluZm9TaXplID0gMDtcbiAgICBsZXQgc3VwcEluZm9UeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICBsZXQgc3VwcEluZm9CdWZmZXIgPSBudWxsO1xuICAgIGlmIChkaXN0YW5jZU1ldHJpYyA9PT0gV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSCB8fCBkaXN0YW5jZU1ldHJpYyA9PT0gV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSkge1xuICAgICAgICBsZXQgbWF4TW9ub21lckluZGV4ID0gb3B0aW9ucy5zY29yaW5nTWF0cml4ICYmIG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzID9cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzKS5yZWR1Y2UoKHByZXYsIG4pID0+IE1hdGgubWF4KHByZXYsIG4uY2hhckNvZGVBdCgwKSksIDApIDogLTE7XG4gICAgICAgIC8vIGdlbmVyYXRlIGRlZmF1bHQgc2ltaWxhcml0eSBtYXRyaXggaWYgaXQgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgIGlmICghb3B0aW9ucy5hbHBoYWJldEluZGV4ZXMgfHwgIW9wdGlvbnMuc2NvcmluZ01hdHJpeCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbGF0U291cmNlQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdFNvdXJjZUFycmF5W2ldID4gbWF4TW9ub21lckluZGV4KVxuICAgICAgICAgICAgICAgICAgICBtYXhNb25vbWVySW5kZXggPSBmbGF0U291cmNlQXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zLnNjb3JpbmdNYXRyaXggPVxuICAgICAgICAgICAgICAgIG5ldyBBcnJheShtYXhNb25vbWVySW5kZXggKyAxKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkuZmlsbCgwKSk7XG4gICAgICAgICAgICBvcHRpb25zLmFscGhhYmV0SW5kZXhlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLnNjb3JpbmdNYXRyaXgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNjb3JpbmdNYXRyaXhbaV1baV0gPSAxO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzW1N0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaW1pbGFyaXR5TWF0cml4U2l6ZSA9IChtYXhNb25vbWVySW5kZXggKyAxKSAqIChtYXhNb25vbWVySW5kZXggKyAxKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXggPSBuZXcgQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEZsb2F0MzJBcnJheShtYXhNb25vbWVySW5kZXggKyAxKSk7XG4gICAgICAgIC8vIHNldCBkaWFnb25hbCB0byAxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TW9ub21lckluZGV4ICsgMTsgaSsrKVxuICAgICAgICAgICAgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhbaV1baV0gPSAxO1xuICAgICAgICBjb25zdCBhbHBoYWJldEluZGV4ZXMgPSBvcHRpb25zLmFscGhhYmV0SW5kZXhlcztcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYWxwaGFiZXRJbmRleGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkyIG9mIE9iamVjdC5rZXlzKGFscGhhYmV0SW5kZXhlcykpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBrZXkyKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtrZXkuY2hhckNvZGVBdCgwKV1ba2V5Mi5jaGFyQ29kZUF0KDApXSA9XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNba2V5XV1bYWxwaGFiZXRJbmRleGVzW2tleTJdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpbiBtZW1vcnkgbGF5b3V0LCB3ZSB3aWxsIGhhdmUgMiBmbG9hdDMyIHMgZm9yIGdhcE9wZW4gYW5kIGdhcEV4dGVuc2lvbiBwZW5hbHRpZXMsIGFuZCB0aGVuIGYzMiBhcnJheTxhcnJheTxmMzI+PiBmb3Igc2ltaWxhcml0eSBtYXRyaXguXG4gICAgICAgIC8vIGJlY2F1c2Ugb2YgcHJpbWl0aXZlcywgdGhlcmUgd2lsbCBiZSBubyBwYWRkaW5nLCBzbyB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBzaXplIGRpcmVjdGx5XG4gICAgICAgIHN1cHBJbmZvU2l6ZSA9IDIgKyBzaW1pbGFyaXR5TWF0cml4U2l6ZTtcbiAgICAgICAgc3VwcEluZm9UeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICAgICAgc3VwcEluZm9CdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KHN1cHBJbmZvU2l6ZSk7XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyWzBdID0gKF9hID0gb3B0aW9ucy5nYXBPcGVuUGVuYWx0eSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMS4wO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlclsxXSA9IChfYiA9IG9wdGlvbnMuZ2FwRXh0ZW5zaW9uUGVuYWx0eSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMC42O1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3VwcEluZm9CdWZmZXIuc2V0KHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2ldLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBzdXBwSW5mb1N0cnVjdFdnc2wgPSBgXG4gICAgICAgICAgICBnYXBPcGVuUGVuYWx0eSR7ZW50cnlJbmRleH06IGYzMixcbiAgICAgICAgICAgIGdhcEV4dGVuc2lvblBlbmFsdHkke2VudHJ5SW5kZXh9OiBmMzIsXG4gICAgICAgICAgICBzaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fTogYXJyYXk8YXJyYXk8ZjMyLCAke21heE1vbm9tZXJJbmRleCArIDF9PiwgJHttYXhNb25vbWVySW5kZXggKyAxfT5gO1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXN0YW5jZU1ldHJpYyA9PT0gV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZSkge1xuICAgICAgICAvLyBmb3IgZGlmZmVyZW5jZSwgd2UgbmVlZCByYW5nZSBvZiB2YWx1ZXMgZm9yIG5vcm1hbGl6YXRpb24gb2YgdGhlIGRpZmZlcmVuY2VcbiAgICAgICAgaWYgKCFvcHRpb25zLnJhbmdlIHx8IHR5cGVvZiBvcHRpb25zLnJhbmdlICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLnJhbmdlIDw9IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IGZsYXRTb3VyY2VBcnJheS5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWluKGEsIGIpLCBmbGF0U291cmNlQXJyYXlbMF0pO1xuICAgICAgICAgICAgY29uc3QgbWF4ID0gZmxhdFNvdXJjZUFycmF5LnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIGZsYXRTb3VyY2VBcnJheVswXSk7XG4gICAgICAgICAgICBvcHRpb25zLnJhbmdlID0gbWF4IC0gbWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJhbmdlIDw9IDApXG4gICAgICAgICAgICBvcHRpb25zLnJhbmdlID0gMS4wOyAvLyB0aGlzIG1lYW5zIHRoYXQgYWxsIHZhbHVlcyBhcmUgdGhlIHNhbWUsIGFuZCBhbGwgZGlzdGFuY2VzIHdpbGwgcHJvZHVjZSAwLlxuICAgICAgICBzdXBwSW5mb1NpemUgPSAxO1xuICAgICAgICBzdXBwSW5mb1R5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoW29wdGlvbnMucmFuZ2VdKTtcbiAgICAgICAgc3VwcEluZm9TdHJ1Y3RXZ3NsID0gYFxuICAgICAgICAgICAgcmFuZ2Uke2VudHJ5SW5kZXh9OiBmMzJgO1xuICAgIH1cbiAgICBjb25zdCBkYXRhVHlwZVdHU0wgPSBmbGF0U291cmNlQXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ID8gJ2kzMicgOiAoZmxhdFNvdXJjZUFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ID8gJ2YzMicgOiAndTMyJyk7XG4gICAgY29uc3QgZGF0YVN0cnVjdFdnc2wgPSBgZGF0YSR7ZW50cnlJbmRleH06IGFycmF5PGFycmF5PCR7ZGF0YVR5cGVXR1NMfSwgJHttYXhFbnRyeUxlbn0+LCAke2VuY29kZWRMaXN0Lmxlbmd0aH0+YDtcbiAgICAvLyBmb3Igbm93LCBvdGhlciBkaXN0YW5jZXMgZG8gbm90IHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHNvIHdlIGNhbiBza2lwIHRoYXRcbiAgICByZXR1cm4ge1xuICAgICAgICBmbGF0U291cmNlQXJyYXksXG4gICAgICAgIHNvdXJjZUFycmF5U2l6ZTogZmxhdFNvdXJjZUFycmF5Lmxlbmd0aCxcbiAgICAgICAgbWF4RW50cnlMZW4sXG4gICAgICAgIGFycmF5U2l6ZXMsXG4gICAgICAgIGNvbXBsZXhpdHksXG4gICAgICAgIHN1cHBJbmZvQnVmZmVyLFxuICAgICAgICBzdXBwSW5mb1NpemUsXG4gICAgICAgIHN1cHBJbmZvVHlwZTogc3VwcEluZm9UeXBlLFxuICAgICAgICBzdXBwSW5mb1N0cnVjdFdnc2wsXG4gICAgICAgIGVudHJ5VHlwZSxcbiAgICAgICAgZGF0YVR5cGVXR1NMLFxuICAgICAgICBkYXRhU3RydWN0V2dzbCxcbiAgICAgICAgRW5jb2RlZEFycmF5Q29uc3RydWN0b3JcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLXByb2Nlc3MtaW5mby5qcy5tYXAiLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gYmlvTGF5b3V0KGNsdXN0ZXIsIHNwYXJzZU9iamVjdCwgdGhyZXNob2xkKSB7XG4gICAgY29uc3QgbiA9IGNsdXN0ZXIubGVuZ3RoO1xuICAgIGNvbnN0IGlzID0gW107XG4gICAgY29uc3QganMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjbHVzdGVyW2ldO1xuICAgICAgICAgICAgY29uc3QgYiA9IGNsdXN0ZXJbal07XG4gICAgICAgICAgICBpZiAoc3BhcnNlT2JqZWN0W2FdPy5bYl0gPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgaXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRMYXlvdXRFbWJlZGRpbmdzKGlzLCBqcywgY2x1c3Rlcik7XG59XG5mdW5jdGlvbiBnZXRMYXlvdXRFbWJlZGRpbmdzKGlzLCBqcywgY2x1c3Rlcikge1xuICAgIGNvbnN0IGVtYmVkWCA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCkubWFwKCgpID0+IE1hdGgucmFuZG9tKCkgKiAxMCk7XG4gICAgY29uc3QgZW1iZWRZID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKS5tYXAoKCkgPT4gTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgICBjb25zdCBpdGVyYXRpb25zID0gMTAwO1xuICAgIGNvbnN0IHhWZWxvY2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBjb25zdCB5VmVsb2NpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGVtcGVyYXR1cmUgPSAoMSAtIGkgLyBpdGVyYXRpb25zKTtcbiAgICAgICAgeFZlbG9jaXRpZXMuZmlsbCgwKTtcbiAgICAgICAgeVZlbG9jaXRpZXMuZmlsbCgwKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgaXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY29uc3QgYSA9IGlzW2lkeF07XG4gICAgICAgICAgICBjb25zdCBiID0ganNbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGR4ID0gZW1iZWRYW2FdIC0gZW1iZWRYW2JdO1xuICAgICAgICAgICAgY29uc3QgZHkgPSBlbWJlZFlbYV0gLSBlbWJlZFlbYl07XG4gICAgICAgICAgICAvLyAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgICAgICAgIC8vICAgY29uc3QgZmFjdG9yID0gKGRpc3RhbmNlIC0gMSkgLyBkaXN0YW5jZTtcbiAgICAgICAgICAgIC8vICAgY29uc3Qgb2Zmc2V0WCA9IGR4ICogZmFjdG9yO1xuICAgICAgICAgICAgLy8gICBjb25zdCBvZmZzZXRZID0gZHkgKiBmYWN0b3I7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHgpID49IDEpIHtcbiAgICAgICAgICAgICAgICB4VmVsb2NpdGllc1thXSAtPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgICAgICAgICAgIHhWZWxvY2l0aWVzW2JdICs9IHRlbXBlcmF0dXJlICogZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHkpID49IDEpIHtcbiAgICAgICAgICAgICAgICB5VmVsb2NpdGllc1thXSAtPSB0ZW1wZXJhdHVyZSAqIGR5O1xuICAgICAgICAgICAgICAgIHlWZWxvY2l0aWVzW2JdICs9IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgIGVtYmVkWVthXSArPSBvZmZzZXRZICogdGVtcGVyYXR1cmU7XG4gICAgICAgICAgICAvLyAgIGVtYmVkWVtiXSAtPSBvZmZzZXRZICogdGVtcGVyYXR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCB2ZWNTaXplID0gTWF0aC5zcXJ0KHhWZWxvY2l0aWVzW2lkeF0gKiB4VmVsb2NpdGllc1tpZHhdICsgeVZlbG9jaXRpZXNbaWR4XSAqIHlWZWxvY2l0aWVzW2lkeF0pO1xuICAgICAgICAgICAgaWYgKHZlY1NpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgZW1iZWRYW2lkeF0gKz0geFZlbG9jaXRpZXNbaWR4XSAvIHZlY1NpemUgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgICAgICAgICBlbWJlZFlbaWR4XSArPSB5VmVsb2NpdGllc1tpZHhdIC8gdmVjU2l6ZSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG5vcm1hbGl6ZVxuICAgIGxldCBtaW5YID0gZW1iZWRYWzBdO1xuICAgIGxldCBtaW5ZID0gZW1iZWRZWzBdO1xuICAgIGxldCBtYXhYID0gZW1iZWRYWzBdO1xuICAgIGxldCBtYXhZID0gZW1iZWRZWzBdO1xuICAgIGZvciAobGV0IGlkeCA9IDE7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZW1iZWRYW2lkeF0pO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgZW1iZWRZW2lkeF0pO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgZW1iZWRYW2lkeF0pO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZW1iZWRZW2lkeF0pO1xuICAgIH1cbiAgICBsZXQgcmFuZ2VYID0gbWF4WCAtIG1pblg7XG4gICAgbGV0IHJhbmdlWSA9IG1heFkgLSBtaW5ZO1xuICAgIGlmIChyYW5nZVggPT09IDApXG4gICAgICAgIHJhbmdlWCA9IG1heFg7XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKVxuICAgICAgICBlbWJlZFhbaWR4XSA9IChlbWJlZFhbaWR4XSAtIG1pblgpIC8gcmFuZ2VYIC8gMiArIDAuNTtcbiAgICBpZiAocmFuZ2VZID09PSAwKVxuICAgICAgICByYW5nZVkgPSBtYXhZO1xuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICAgICAgZW1iZWRZW2lkeF0gPSAoZW1iZWRZW2lkeF0gLSBtaW5ZKSAvIHJhbmdlWSAvIDIgKyAwLjU7XG4gICAgcmV0dXJuIHsgZW1iZWRYLCBlbWJlZFkgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaVltbHZMV3hoZVc5MWRDNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSW1KcGJ5MXNZWGx2ZFhRdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJSVUVzVFVGQlRTeERRVUZETEV0QlFVc3NWVUZCVlN4VFFVRlRMRU5CUVVNc1QwRkJhVUlzUlVGQlJTeFpRVUZuUXl4RlFVRkZMRk5CUVdsQ08wbEJRM0JITEUxQlFVMHNRMEZCUXl4SFFVRkhMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU03U1VGRGVrSXNUVUZCVFN4RlFVRkZMRWRCUVdFc1JVRkJSU3hEUVVGRE8wbEJRM2hDTEUxQlFVMHNSVUZCUlN4SFFVRmhMRVZCUVVVc1EwRkJRenRKUVVONFFpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUXpGQ0xFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUXpsQ0xFMUJRVTBzUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRaUVVOeVFpeE5RVUZOTEVOQlFVTXNSMEZCUnl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGNrSXNTVUZCU1N4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4VFFVRlRMRVZCUVVVN1owSkJRM0pETEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlExZ3NSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dGhRVU5hTzFOQlEwWTdTMEZEUmp0SlFVTkVMRTlCUVU4c2JVSkJRVzFDTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hQUVVGUExFTkJRVU1zUTBGQlF6dEJRVU01UXl4RFFVRkRPMEZCUlVRc1UwRkJVeXh0UWtGQmJVSXNRMEZCUXl4RlFVRlpMRVZCUVVVc1JVRkJXU3hGUVVGRkxFOUJRV2xDTzBsQlEzaEZMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJRenRKUVVOMFJpeE5RVUZOTEUxQlFVMHNSMEZCUnl4SlFVRkpMRmxCUVZrc1EwRkJReXhQUVVGUExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFZEJRVWNzUlVGQlJTeERRVUZETEVOQlFVTTdTVUZEZEVZc1RVRkJUU3hWUVVGVkxFZEJRVWNzUjBGQlJ5eERRVUZETzBsQlEzWkNMRTFCUVUwc1YwRkJWeXhIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZETjBRc1RVRkJUU3hYUVVGWExFZEJRVWNzU1VGQlNTeFpRVUZaTEVOQlFVTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTTNSQ3hMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1ZVRkJWU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFGQlEyNURMRTFCUVUwc1YwRkJWeXhIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1EwRkJRenRSUVVONlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0JDTEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGNFSXNTMEZCU3l4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRExFVkJRVVVzUjBGQlJ5eEhRVUZITEVWQlFVVXNRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhGUVVGRkxFVkJRVVU3V1VGRGVFTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFsQlEyeENMRTFCUVUwc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVTnNRaXhOUVVGTkxFVkJRVVVzUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEycERMRTFCUVUwc1JVRkJSU3hIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGFrTXNiVVJCUVcxRU8xbEJRMjVFTERoRFFVRTRRenRaUVVNNVF5eHBRMEZCYVVNN1dVRkRha01zYVVOQlFXbERPMWxCUTJwRExFbEJRVWtzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVU3WjBKQlEzSkNMRmRCUVZjc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeFhRVUZYTEVkQlFVY3NSVUZCUlN4RFFVRkRPMmRDUVVOdVF5eFhRVUZYTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1YwRkJWeXhIUVVGSExFVkJRVVVzUTBGQlF6dGhRVU53UXp0WlFVTkVMRWxCUVVrc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVN1owSkJRM0pDTEZkQlFWY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hYUVVGWExFZEJRVWNzUlVGQlJTeERRVUZETzJkQ1FVTnVReXhYUVVGWExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NWMEZCVnl4SFFVRkhMRVZCUVVVc1EwRkJRenRoUVVOd1F6dFpRVU5JTEhkRFFVRjNRenRaUVVONFF5eDNRMEZCZDBNN1UwRkRka003VVVGRFJDeExRVUZMTEVsQlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1JVRkJSU3hIUVVGSExFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRVZCUVVVc1JVRkJSVHRaUVVNM1F5eE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4WFFVRlhMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzVjBGQlZ5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRmRCUVZjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEzSkhMRWxCUVVrc1QwRkJUeXhIUVVGSExFTkJRVU1zUlVGQlJUdG5Ra0ZEWml4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzVjBGQlZ5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRTlCUVU4c1IwRkJSeXhYUVVGWExFTkJRVU03WjBKQlEzaEVMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeFhRVUZYTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1QwRkJUeXhIUVVGSExGZEJRVmNzUTBGQlF6dGhRVU42UkR0VFFVTkdPMHRCUTBZN1NVRkZSQ3haUVVGWk8wbEJRMW9zU1VGQlNTeEpRVUZKTEVkQlFVY3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM0pDTEVsQlFVa3NTVUZCU1N4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU55UWl4SlFVRkpMRWxCUVVrc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEY2tJc1NVRkJTU3hKUVVGSkxFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTNKQ0xFdEJRVXNzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRWRCUVVjc1IwRkJSeXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RlFVRkZPMUZCUXpkRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1JVRkJSU3hOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTnVReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRVZCUVVVc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEYmtNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RlFVRkZMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEyNURMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dExRVU53UXp0SlFVTkVMRWxCUVVrc1RVRkJUU3hIUVVGSExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTTdTVUZEZWtJc1NVRkJTU3hOUVVGTkxFZEJRVWNzU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXp0SlFVTjZRaXhKUVVGSkxFMUJRVTBzUzBGQlN5eERRVUZETzFGQlEyUXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJRenRKUVVOb1FpeExRVUZMTEVsQlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1JVRkJSU3hIUVVGSExFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRVZCUVVVN1VVRkRNME1zVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRTFCUVUwc1IwRkJSeXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETzBsQlEzaEVMRWxCUVVrc1RVRkJUU3hMUVVGTExFTkJRVU03VVVGRFpDeE5RVUZOTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUTJoQ0xFdEJRVXNzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRWRCUVVjc1IwRkJSeXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZGTEVkQlFVY3NSVUZCUlR0UlFVTXpReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NUVUZCVFN4SFFVRkhMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03U1VGRmVFUXNUMEZCVHl4RlFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVU1zUTBGQlF6dEJRVU14UWl4RFFVRkRJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1I5SUdaeWIyMGdKeTR2ZEhsd1pYTW5PMXh1WEc1bGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdZbWx2VEdGNWIzVjBLR05zZFhOMFpYSTZJRzUxYldKbGNsdGRMQ0J6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDd2dkR2h5WlhOb2IyeGtPaUJ1ZFcxaVpYSXBJSHRjYmlBZ1kyOXVjM1FnYmlBOUlHTnNkWE4wWlhJdWJHVnVaM1JvTzF4dUlDQmpiMjV6ZENCcGN6b2diblZ0WW1WeVcxMGdQU0JiWFR0Y2JpQWdZMjl1YzNRZ2FuTTZJRzUxYldKbGNsdGRJRDBnVzEwN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYmpzZ2FTc3JLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhaUE5SUdrZ0t5QXhPeUJxSUR3Z2Jqc2dhaXNyS1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0JoSUQwZ1kyeDFjM1JsY2x0cFhUdGNiaUFnSUNBZ0lHTnZibk4wSUdJZ1BTQmpiSFZ6ZEdWeVcycGRPMXh1SUNBZ0lDQWdhV1lnS0hOd1lYSnpaVTlpYW1WamRGdGhYVDh1VzJKZElENDlJSFJvY21WemFHOXNaQ2tnZTF4dUlDQWdJQ0FnSUNCcGN5NXdkWE5vS0drcE8xeHVJQ0FnSUNBZ0lDQnFjeTV3ZFhOb0tHb3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnlaWFIxY200Z1oyVjBUR0Y1YjNWMFJXMWlaV1JrYVc1bmN5aHBjeXdnYW5Nc0lHTnNkWE4wWlhJcE8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCblpYUk1ZWGx2ZFhSRmJXSmxaR1JwYm1kektHbHpPaUJ1ZFcxaVpYSmJYU3dnYW5NNklHNTFiV0psY2x0ZExDQmpiSFZ6ZEdWeU9pQnVkVzFpWlhKYlhTa2dlMXh1SUNCamIyNXpkQ0JsYldKbFpGZ2dQU0J1WlhjZ1JteHZZWFF6TWtGeWNtRjVLR05zZFhOMFpYSXViR1Z1WjNSb0tTNW1hV3hzS0RBcExtMWhjQ2dvS1NBOVBpQk5ZWFJvTG5KaGJtUnZiU2dwSUNvZ01UQXBPMXh1SUNCamIyNXpkQ0JsYldKbFpGa2dQU0J1WlhjZ1JteHZZWFF6TWtGeWNtRjVLR05zZFhOMFpYSXViR1Z1WjNSb0tTNW1hV3hzS0RBcExtMWhjQ2dvS1NBOVBpQk5ZWFJvTG5KaGJtUnZiU2dwSUNvZ01UQXBPMXh1SUNCamIyNXpkQ0JwZEdWeVlYUnBiMjV6SUQwZ01UQXdPMXh1SUNCamIyNXpkQ0I0Vm1Wc2IyTnBkR2xsY3lBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb1kyeDFjM1JsY2k1c1pXNW5kR2dwTG1acGJHd29NQ2s3WEc0Z0lHTnZibk4wSUhsV1pXeHZZMmwwYVdWeklEMGdibVYzSUVac2IyRjBNekpCY25KaGVTaGpiSFZ6ZEdWeUxteGxibWQwYUNrdVptbHNiQ2d3S1R0Y2JpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0JwZEdWeVlYUnBiMjV6T3lCcEt5c3BJSHRjYmlBZ0lDQmpiMjV6ZENCMFpXMXdaWEpoZEhWeVpTQTlJQ2d4SUMwZ2FTQXZJR2wwWlhKaGRHbHZibk1wTzF4dUlDQWdJSGhXWld4dlkybDBhV1Z6TG1acGJHd29NQ2s3WEc0Z0lDQWdlVlpsYkc5amFYUnBaWE11Wm1sc2JDZ3dLVHRjYmlBZ0lDQm1iM0lnS0d4bGRDQnBaSGdnUFNBd095QnBaSGdnUENCcGN5NXNaVzVuZEdnN0lHbGtlQ3NyS1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0JoSUQwZ2FYTmJhV1I0WFR0Y2JpQWdJQ0FnSUdOdmJuTjBJR0lnUFNCcWMxdHBaSGhkTzF4dUlDQWdJQ0FnWTI5dWMzUWdaSGdnUFNCbGJXSmxaRmhiWVYwZ0xTQmxiV0psWkZoYllsMDdYRzRnSUNBZ0lDQmpiMjV6ZENCa2VTQTlJR1Z0WW1Wa1dWdGhYU0F0SUdWdFltVmtXVnRpWFR0Y2JpQWdJQ0FnSUM4dklDQWdZMjl1YzNRZ1pHbHpkR0Z1WTJVZ1BTQk5ZWFJvTG5OeGNuUW9aSGdnS2lCa2VDQXJJR1I1SUNvZ1pIa3BPMXh1SUNBZ0lDQWdMeThnSUNCamIyNXpkQ0JtWVdOMGIzSWdQU0FvWkdsemRHRnVZMlVnTFNBeEtTQXZJR1JwYzNSaGJtTmxPMXh1SUNBZ0lDQWdMeThnSUNCamIyNXpkQ0J2Wm1aelpYUllJRDBnWkhnZ0tpQm1ZV04wYjNJN1hHNGdJQ0FnSUNBdkx5QWdJR052Ym5OMElHOW1abk5sZEZrZ1BTQmtlU0FxSUdaaFkzUnZjanRjYmlBZ0lDQWdJR2xtSUNoTllYUm9MbUZpY3loa2VDa2dQajBnTVNrZ2UxeHVJQ0FnSUNBZ0lDQjRWbVZzYjJOcGRHbGxjMXRoWFNBdFBTQjBaVzF3WlhKaGRIVnlaU0FxSUdSNE8xeHVJQ0FnSUNBZ0lDQjRWbVZzYjJOcGRHbGxjMXRpWFNBclBTQjBaVzF3WlhKaGRIVnlaU0FxSUdSNE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2FXWWdLRTFoZEdndVlXSnpLR1I1S1NBK1BTQXhLU0I3WEc0Z0lDQWdJQ0FnSUhsV1pXeHZZMmwwYVdWelcyRmRJQzA5SUhSbGJYQmxjbUYwZFhKbElDb2daSGs3WEc0Z0lDQWdJQ0FnSUhsV1pXeHZZMmwwYVdWelcySmRJQ3M5SUhSbGJYQmxjbUYwZFhKbElDb2daSGs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdMeThnSUNCbGJXSmxaRmxiWVYwZ0t6MGdiMlptYzJWMFdTQXFJSFJsYlhCbGNtRjBkWEpsTzF4dUlDQWdJQzh2SUNBZ1pXMWlaV1JaVzJKZElDMDlJRzltWm5ObGRGa2dLaUIwWlcxd1pYSmhkSFZ5WlR0Y2JpQWdJQ0I5WEc0Z0lDQWdabTl5SUNoc1pYUWdhV1I0SUQwZ01Ec2dhV1I0SUR3Z1kyeDFjM1JsY2k1c1pXNW5kR2c3SUdsa2VDc3JLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQjJaV05UYVhwbElEMGdUV0YwYUM1emNYSjBLSGhXWld4dlkybDBhV1Z6VzJsa2VGMGdLaUI0Vm1Wc2IyTnBkR2xsYzF0cFpIaGRJQ3NnZVZabGJHOWphWFJwWlhOYmFXUjRYU0FxSUhsV1pXeHZZMmwwYVdWelcybGtlRjBwTzF4dUlDQWdJQ0FnYVdZZ0tIWmxZMU5wZW1VZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUdWdFltVmtXRnRwWkhoZElDczlJSGhXWld4dlkybDBhV1Z6VzJsa2VGMGdMeUIyWldOVGFYcGxJQ29nZEdWdGNHVnlZWFIxY21VN1hHNGdJQ0FnSUNBZ0lHVnRZbVZrV1Z0cFpIaGRJQ3M5SUhsV1pXeHZZMmwwYVdWelcybGtlRjBnTHlCMlpXTlRhWHBsSUNvZ2RHVnRjR1Z5WVhSMWNtVTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeThnYm05eWJXRnNhWHBsWEc0Z0lHeGxkQ0J0YVc1WUlEMGdaVzFpWldSWVd6QmRPMXh1SUNCc1pYUWdiV2x1V1NBOUlHVnRZbVZrV1Zzd1hUdGNiaUFnYkdWMElHMWhlRmdnUFNCbGJXSmxaRmhiTUYwN1hHNGdJR3hsZENCdFlYaFpJRDBnWlcxaVpXUlpXekJkTzF4dUlDQm1iM0lnS0d4bGRDQnBaSGdnUFNBeE95QnBaSGdnUENCamJIVnpkR1Z5TG14bGJtZDBhRHNnYVdSNEt5c3BJSHRjYmlBZ0lDQnRhVzVZSUQwZ1RXRjBhQzV0YVc0b2JXbHVXQ3dnWlcxaVpXUllXMmxrZUYwcE8xeHVJQ0FnSUcxcGJsa2dQU0JOWVhSb0xtMXBiaWh0YVc1WkxDQmxiV0psWkZsYmFXUjRYU2s3WEc0Z0lDQWdiV0Y0V0NBOUlFMWhkR2d1YldGNEtHMWhlRmdzSUdWdFltVmtXRnRwWkhoZEtUdGNiaUFnSUNCdFlYaFpJRDBnVFdGMGFDNXRZWGdvYldGNFdTd2daVzFpWldSWlcybGtlRjBwTzF4dUlDQjlYRzRnSUd4bGRDQnlZVzVuWlZnZ1BTQnRZWGhZSUMwZ2JXbHVXRHRjYmlBZ2JHVjBJSEpoYm1kbFdTQTlJRzFoZUZrZ0xTQnRhVzVaTzF4dUlDQnBaaUFvY21GdVoyVllJRDA5UFNBd0tWeHVJQ0FnSUhKaGJtZGxXQ0E5SUcxaGVGZzdYRzRnSUdadmNpQW9iR1YwSUdsa2VDQTlJREE3SUdsa2VDQThJR05zZFhOMFpYSXViR1Z1WjNSb095QnBaSGdyS3lsY2JpQWdJQ0JsYldKbFpGaGJhV1I0WFNBOUlDaGxiV0psWkZoYmFXUjRYU0F0SUcxcGJsZ3BJQzhnY21GdVoyVllJQzhnTWlBcklEQXVOVHRjYmlBZ2FXWWdLSEpoYm1kbFdTQTlQVDBnTUNsY2JpQWdJQ0J5WVc1blpWa2dQU0J0WVhoWk8xeHVJQ0JtYjNJZ0tHeGxkQ0JwWkhnZ1BTQXdPeUJwWkhnZ1BDQmpiSFZ6ZEdWeUxteGxibWQwYURzZ2FXUjRLeXNwWEc0Z0lDQWdaVzFpWldSWlcybGtlRjBnUFNBb1pXMWlaV1JaVzJsa2VGMGdMU0J0YVc1WktTQXZJSEpoYm1kbFdTQXZJRElnS3lBd0xqVTdYRzVjYmlBZ2NtVjBkWEp1SUh0bGJXSmxaRmdzSUdWdFltVmtXWDA3WEc1OVhHNGlYWDA9IiwiaW1wb3J0IHsgYmlvTGF5b3V0IH0gZnJvbSAnLi9iaW8tbGF5b3V0JztcbmV4cG9ydCBjb25zdCBkZWZhdWx0TUNMT3B0aW9ucyA9IHtcbiAgICBleHBhbmRGYWN0b3I6IDIsXG4gICAgbWF4SXRlcmF0aW9uczogNSxcbiAgICBpbmZsYXRlRmFjdG9yOiAyLFxuICAgIG11bHRGYWN0b3I6IDEsXG59O1xuZXhwb3J0IGNsYXNzIE1DTFNwYXJzZVJlZHVjZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0geyAuLi5kZWZhdWx0TUNMT3B0aW9ucywgLi4ub3B0cyB9O1xuICAgIH1cbiAgICBhc3luYyB0cmFuc2Zvcm0oc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgICAgICAvLyB0ZXN0V29ya2VyTXVsdGlwbHkoKTtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBJbnQzMkFycmF5KG5Sb3dzKTtcbiAgICAgICAgbGV0IHNwYXJzZU9iamVjdCA9IHRoaXMudG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeCk7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFkZExvb3BzKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoc3BhcnNlT2JqZWN0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3QgPSB0aGlzLmV4cGFuZChzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZmxhdGUoc3BhcnNlT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgY2x1c3RlcnMsIGlzLCBqcyB9ID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgICBjb25zdCBlbWJlZGRpbmdzID0gYXdhaXQgdGhpcy5sYXlvdXQoY2x1c3RlcnMsIHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICByZXR1cm4geyBjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzIH07XG4gICAgfVxuICAgIGNvcnJlY3RDbHVzdGVycyhjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgICAgIGlmICghY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0gPSAwO1xuICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0rKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2FdIC0gY2x1c3RlclNpemVNYXBbYl0pO1xuICAgICAgICBjb25zdCBjbHVzdGVyTWFwID0ge307XG4gICAgICAgIHNvcnRlZEluZGV4ZXMuZm9yRWFjaCgoY2x1c3RlcklkeCwgaSkgPT4gY2x1c3Rlck1hcFtjbHVzdGVySWR4XSA9IGkgKyAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgICAgIC8vIGxldCBjdXJDbHVzdGVyID0gMTtcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV0pIHtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJzW2ldID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGN1ckNsdXN0ZXIrKztcbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTWFwW2NsdXN0ZXJzW2ldXTtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG4gICAgYXN5bmMgbGF5b3V0KGNsdXN0ZXJzLCBzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgICAgIGNvbnN0IGVtYmVkWCA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJNYXAgPSB7fTtcbiAgICAgICAgY2x1c3RlcnMuZm9yRWFjaCgoY2x1c3RlciwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjbHVzdGVyTWFwW2NsdXN0ZXJdKVxuICAgICAgICAgICAgICAgIGNsdXN0ZXJNYXBbY2x1c3Rlcl0gPSBbXTtcbiAgICAgICAgICAgIGNsdXN0ZXJNYXBbY2x1c3Rlcl0ucHVzaChpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnN0IG5DbHVzdGVycyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApLmxlbmd0aDtcbiAgICAgICAgLy8gY29uc3QgcGVyUm93ID0gTWF0aC5mbG9vcihNYXRoLnNxcnQobkNsdXN0ZXJzKSk7XG4gICAgICAgIGxldCBjbHVzdGVyTnVtID0gMDtcbiAgICAgICAgY29uc3Qgc29ydGVkQ2x1c3Rlck5hbWVzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCk7XG4gICAgICAgIHNvcnRlZENsdXN0ZXJOYW1lcy5zb3J0KChhLCBiKSA9PiBjbHVzdGVyTWFwW2JdLmxlbmd0aCAtIGNsdXN0ZXJNYXBbYV0ubGVuZ3RoKTtcbiAgICAgICAgbGV0IHBlclJvdyA9IDY7XG4gICAgICAgIGxldCB5T2Zmc2V0ID0gMDtcbiAgICAgICAgY29uc3QgbGF5b3V0U2l6ZSA9IDU7XG4gICAgICAgIGZvciAoY29uc3QgY2x1c3Rlck5hbWUgb2Ygc29ydGVkQ2x1c3Rlck5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCBjbHVzdGVyID0gY2x1c3Rlck1hcFtjbHVzdGVyTmFtZV07XG4gICAgICAgICAgICBjb25zdCBlbWJlZGRpbmdzID0gYXdhaXQgYmlvTGF5b3V0KGNsdXN0ZXIsIHNwYXJzZU1hdHJpeCwgMC4wMDEpO1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJOdW0gPT09IE1hdGguY2VpbChwZXJSb3cgLyAxLjUpKSB7XG4gICAgICAgICAgICAgICAgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgICAgICAgICAgeU9mZnNldCArPSBsYXlvdXRTaXplIC8gcGVyUm93O1xuICAgICAgICAgICAgICAgIHBlclJvdyA9IE1hdGguY2VpbChwZXJSb3cgKiAxLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9ICgoY2x1c3Rlck51bSAlIHBlclJvdykgKiBsYXlvdXRTaXplIC8gcGVyUm93KSAqIDEuNTtcbiAgICAgICAgICAgIC8vIGNvbnN0IG9mZnNldFkgPSBNYXRoLmZsb29yKGNsdXN0ZXJOdW0gLyBwZXJSb3cpICogMjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkaW5ncy5lbWJlZFgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBlbWJlZFhbY2x1c3RlcltpXV0gPSBlbWJlZGRpbmdzLmVtYmVkWFtpXSAqIGxheW91dFNpemUgLyBwZXJSb3cgKyBvZmZzZXRYO1xuICAgICAgICAgICAgICAgIGVtYmVkWVtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRZW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIHlPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZW1iZWRYLCBlbWJlZFkgfTtcbiAgICB9XG4gICAgbWVyZ2VDbHVzdGVycyhjbHVzdGVycywgaSwgaikge1xuICAgICAgICBjb25zdCBpQ2x1c3RlciA9IGNsdXN0ZXJzW2ldO1xuICAgICAgICBjb25zdCBqQ2x1c3RlciA9IGNsdXN0ZXJzW2pdO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNsdXN0ZXJzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBpZiAoY2x1c3RlcnNba10gPT09IGpDbHVzdGVyKVxuICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2tdID0gaUNsdXN0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduQ2x1c3RlcnMoc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIGNvbnN0IGlzID0gW107XG4gICAgICAgIGNvbnN0IGpzID0gW107XG4gICAgICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICAgICAgY29uc3QgbWluT3JkZXIgPSBNYXRoLnBvdygxMCwgb3JkZXIpO1xuICAgICAgICBjb25zdCBjbHVzdGVycyA9IG5ldyBBcnJheShuUm93cykuZmlsbCgtMSk7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VNYXRyaXgpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4W2ldKSkge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHNwYXJzZU1hdHJpeFtpXVtqXSAqIG1pbk9yZGVyKSAvIG1pbk9yZGVyID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICBzcGFyc2VNYXRyaXhbaV1bal0gIT09IE51bWJlcihpKSAmJiBOdW1iZXIoaikgPiBOdW1iZXIoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXMucHVzaChOdW1iZXIoaSkpO1xuICAgICAgICAgICAgICAgICAgICBqcy5wdXNoKE51bWJlcihqKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSAtMSAmJiBjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IGNsdXN0ZXJzW051bWJlcihqKV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBOdW1iZXIoaSksIE51bWJlcihqKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyc1tOdW1iZXIoaSldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW051bWJlcihqKV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaSldID0gY2x1c3RlcnNbTnVtYmVyKGopXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihpKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGopXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2x1c3RlcnMsIGlzOiBuZXcgVWludDMyQXJyYXkoaXMpLCBqczogbmV3IFVpbnQzMkFycmF5KGpzKSB9O1xuICAgIH1cbiAgICB0b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KSB7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSA9IHt9O1xuICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXVtzcGFyc2VNYXRyaXgualtpXV0gPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV0gPSB7fTtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV1bc3BhcnNlTWF0cml4LmlbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BhcnNlT2JqZWN0O1xuICAgIH1cbiAgICBhZGRMb29wcyhzcGFyc2VPYmplY3QsIG5Sb3dzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1baV0gPSB0aGlzLl9vcHRpb25zLm11bHRGYWN0b3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9ybWFsaXplKHNwYXJzZU9iamVjdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzdW0gKz0gcm93W2pdO1xuICAgICAgICAgICAgaWYgKHN1bSA9PT0gMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhyb3cpKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXVtqXSAvPSBzdW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRPYmplY3QgPSB7fTtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvLyBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBuUm93czsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0/LltqXSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRFeHBhbmRWYWx1ZShzcGFyc2VPYmplY3QsIGksIGopOyAvL3BydW5pbmcgc3RlcFxuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHZhbCAqIG1pbk9yZGVyKSAvIG1pbk9yZGVyID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXVtqXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBhbmRlZE9iamVjdFtqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwYW5kZWRPYmplY3Q7XG4gICAgfVxuICAgIC8vIHByaXZhdGUgcHJ1bmUocm93OiBTcGFyc2VNYXRyaXhPYmplY3RbbnVtYmVyXSkge1xuICAgIC8vIH1cbiAgICBpbmZsYXRlKHNwYXJzZU9iamVjdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2pdID0gTWF0aC5wb3coc3BhcnNlT2JqZWN0W2ldW2pdLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEV4cGFuZFZhbHVlKHNwYXJzZU9iamVjdCwgaSwgaikge1xuICAgICAgICBsZXQgdmFsID0gMDtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3RbaV0gPz8ge30pO1xuICAgICAgICBjb25zdCBvdGhlckluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3Rbal0gPz8ge30pO1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgY3VycmVudEluZGV4ZXMpIHtcbiAgICAgICAgICAgIGlmIChvdGhlckluZGV4ZXMuaW5jbHVkZXMoaykpXG4gICAgICAgICAgICAgICAgdmFsICs9IHNwYXJzZU9iamVjdFtpXVtrXSAqIHNwYXJzZU9iamVjdFtqXVtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWJXRnlZMjkyTFdOc2RYTjBaWEl1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sY3lJNld5SnRZWEpqYjNZdFkyeDFjM1JsY2k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkRRU3hQUVVGUExFVkJRVU1zVTBGQlV5eEZRVUZETEUxQlFVMHNZMEZCWXl4RFFVRkRPMEZCUjNaRExFMUJRVTBzUTBGQlF5eE5RVUZOTEdsQ1FVRnBRaXhIUVVGbE8wbEJRek5ETEZsQlFWa3NSVUZCUlN4RFFVRkRPMGxCUTJZc1lVRkJZU3hGUVVGRkxFTkJRVU03U1VGRGFFSXNZVUZCWVN4RlFVRkZMRU5CUVVNN1NVRkRhRUlzVlVGQlZTeEZRVUZGTEVOQlFVTTdRMEZEWkN4RFFVRkRPMEZCUlVZc1RVRkJUU3hQUVVGUExHZENRVUZuUWp0SlFVY3pRaXhaUVVGWkxFOUJRVFJDTEVWQlFVVTdVVUZEZUVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEZRVUZETEVkQlFVY3NhVUpCUVdsQ0xFVkJRVVVzUjBGQlJ5eEpRVUZKTEVWQlFVTXNRMEZCUXp0SlFVTnNSQ3hEUVVGRE8wbEJSVTBzUzBGQlN5eERRVUZETEZOQlFWTXNRMEZCUXl4WlFVRm5ReXhGUVVGRkxFdEJRV0U3VVVGRGNFVXNkMEpCUVhkQ08xRkJRM2hDTEdkRFFVRm5RenRSUVVOb1F5eEpRVUZKTEZsQlFWa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFGQlEyNUVMRWxCUVVrc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eGhRVUZoTEVkQlFVY3NRMEZCUXl4RlFVRkZPMWxCUTI1RExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNXVUZCV1N4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xbEJRMjVETEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03V1VGRE4wSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzJkQ1FVTndSQ3haUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03WjBKQlEyaEVMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdaMEpCUXpOQ0xFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1lVRkRPVUk3VTBGRFJqdFJRVU5FTEUxQlFVMHNSVUZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzQkZMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdVVUZETDBJc1RVRkJUU3hWUVVGVkxFZEJRVWNzVFVGQlRTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1JVRkJSU3haUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEY0VVc1QwRkJUeXhGUVVGRExGRkJRVkVzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVVVzVlVGQlZTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRExFTkJRVU03U1VGRGJFWXNRMEZCUXp0SlFVVlBMR1ZCUVdVc1EwRkJReXhSUVVGclFqdFJRVU40UXl4TlFVRk5MR05CUVdNc1IwRkJNRUlzUlVGQlJTeERRVUZETzFGQlEycEVMRXRCUVVzc1RVRkJUU3hQUVVGUExFbEJRVWtzVVVGQlVTeEZRVUZGTzFsQlF6bENMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zVDBGQlR5eERRVUZETzJkQ1FVTXhRaXhqUVVGakxFTkJRVU1zVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUXpsQ0xHTkJRV01zUTBGQlF5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPMU5CUXpOQ08xRkJRMFFzVFVGQlRTeGhRVUZoTEVkQlFVY3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1kwRkJZeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0JJTEUxQlFVMHNWVUZCVlN4SFFVRXdRaXhGUVVGRkxFTkJRVU03VVVGRE4wTXNZVUZCWVN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExGVkJRVlVzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRlZCUVZVc1EwRkJReXhWUVVGVkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRla1VzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZPMWxCUTNSRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEZUVNc2MwSkJRWE5DTzFGQlEzUkNMRGhEUVVFNFF6dFJRVU01UXl4dlEwRkJiME03VVVGRGNFTXNORU5CUVRSRE8xRkJRelZETEdkRFFVRm5RenRSUVVOb1F5eHZRa0ZCYjBJN1VVRkRjRUlzWVVGQllUdFJRVU5pTERaRFFVRTJRenRSUVVNM1F5eE5RVUZOTzFGQlEwNHNTVUZCU1R0SlFVTk9MRU5CUVVNN1NVRkZUeXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFXdENMRVZCUVVVc1dVRkJaME1zUlVGQlJTeExRVUZoTzFGQlEzUkdMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU12UXl4TlFVRk5MRTFCUVUwc1IwRkJSeXhKUVVGSkxGbEJRVmtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGREwwTXNUVUZCVFN4VlFVRlZMRWRCUVRSQ0xFVkJRVVVzUTBGQlF6dFJRVU12UXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zVDBGQlR5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUXpsQ0xFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNUMEZCVHl4RFFVRkRPMmRDUVVOMFFpeFZRVUZWTEVOQlFVTXNUMEZCVHl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE8xbEJRek5DTEZWQlFWVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZET1VJc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRFNDeHZSRUZCYjBRN1VVRkRjRVFzYlVSQlFXMUVPMUZCUTI1RUxFbEJRVWtzVlVGQlZTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTnVRaXhOUVVGTkxHdENRVUZyUWl4SFFVRkhMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTTdVVUZEYmtRc2EwSkJRV3RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRExFMUJRVTBzUjBGQlJ5eFZRVUZWTEVOQlFVTXNRMEZCVVN4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03VVVGRE4wWXNTVUZCU1N4TlFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJSV1lzU1VGQlNTeFBRVUZQTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTJoQ0xFMUJRVTBzVlVGQlZTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTnlRaXhMUVVGTExFMUJRVTBzVjBGQlZ5eEpRVUZKTEd0Q1FVRnJRaXhGUVVGRk8xbEJRelZETEUxQlFVMHNUMEZCVHl4SFFVRkhMRlZCUVZVc1EwRkJReXhYUVVGclFpeERRVUZGTEVOQlFVTTdXVUZEYUVRc1RVRkJUU3hWUVVGVkxFZEJRVWNzVFVGQlRTeFRRVUZUTEVOQlFVTXNUMEZCVHl4RlFVRkZMRmxCUVZrc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFpRVU5xUlN4SlFVRkpMRlZCUVZVc1MwRkJTeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SFFVRkhMRU5CUVVNc1JVRkJSVHRuUWtGRE1VTXNWVUZCVlN4SFFVRkhMRU5CUVVNc1EwRkJRenRuUWtGRFppeFBRVUZQTEVsQlFVa3NWVUZCVlN4SFFVRkhMRTFCUVUwc1EwRkJRenRuUWtGREwwSXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRPMkZCUTJ4RE8xbEJRMFFzVFVGQlRTeFBRVUZQTEVkQlFVY3NRMEZCUXl4RFFVRkRMRlZCUVZVc1IwRkJSeXhOUVVGTkxFTkJRVU1zUjBGQlJ5eFZRVUZWTEVkQlFVY3NUVUZCVFN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRE8xbEJRM0JGTEhWRVFVRjFSRHRaUVVWMlJDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVlVGQlZTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEycEVMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNSMEZCUnl4TlFVRk5MRWRCUVVjc1QwRkJUeXhEUVVGRE8yZENRVU14UlN4TlFVRk5MRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NWVUZCVlN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVkQlFVY3NUVUZCVFN4SFFVRkhMRTlCUVU4c1EwRkJRenRoUVVNelJUdFpRVU5FTEZWQlFWVXNSVUZCUlN4RFFVRkRPMU5CUTJRN1VVRkRSQ3hQUVVGUExFVkJRVU1zVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUXl4RFFVRkRPMGxCUXpGQ0xFTkJRVU03U1VGRlR5eGhRVUZoTEVOQlFVTXNVVUZCYTBJc1JVRkJSU3hEUVVGVExFVkJRVVVzUTBGQlV6dFJRVU0xUkN4TlFVRk5MRkZCUVZFc1IwRkJSeXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZETjBJc1RVRkJUU3hSUVVGUkxFZEJRVWNzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUXpkQ0xFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUTNoRExFbEJRVWtzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRkZCUVZFN1owSkJRekZDTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU03VTBGRE1VSTdTVUZEU0N4RFFVRkRPMGxCUTAwc1kwRkJZeXhEUVVGRExGbEJRV2RETEVWQlFVVXNTMEZCWVR0UlFVTnVSU3hKUVVGSkxGVkJRVlVzUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZEYmtJc1RVRkJUU3hGUVVGRkxFZEJRV0VzUlVGQlJTeERRVUZETzFGQlEzaENMRTFCUVUwc1JVRkJSU3hIUVVGaExFVkJRVVVzUTBGQlF6dFJRVU40UWl4TlFVRk5MRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU0zUkN4TlFVRk5MRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRSUVVOeVF5eE5RVUZOTEZGQlFWRXNSMEZCWVN4SlFVRkpMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOeVJDeExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVWQlFVVTdXVUZEZWtNc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF5eEZRVUZGTzJkQ1FVTnVSQ3hKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRExFTkJRVkVzUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4SFFVRkhMRkZCUVZFc1IwRkJSeXhEUVVGRE8yOUNRVU40UlN4WlFVRlpMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU1zUTBGQlVTeERRVUZETEV0QlFVc3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVU3YjBKQlEzcEZMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2IwSkJRMjVDTEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdiMEpCUTI1Q0xFbEJRVWtzVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlR0M1FrRkROVVFzU1VGQlNTeFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenMwUWtGRE4wTXNTVUZCU1N4RFFVRkRMR0ZCUVdFc1EwRkJReXhSUVVGUkxFVkJRVVVzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzNGQ1FVTjBSRHQ1UWtGQlRTeEpRVUZKTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlR0M1FrRkRja01zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenR4UWtGRE0wTTdlVUpCUVUwc1NVRkJTU3hSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3ZDBKQlEzSkRMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdjVUpCUXpORE8zbENRVUZOTzNkQ1FVTk1MRlZCUVZVc1JVRkJSU3hEUVVGRE8zZENRVU5pTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTTdkMEpCUTJwRExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU03Y1VKQlEyeERPMmxDUVVOR08yRkJRMFk3VTBGRFJqdFJRVU5FTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRM1JETEVsQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEZRVUZGTzJkQ1FVTjBRaXhWUVVGVkxFVkJRVWNzUTBGQlF6dG5Ra0ZEWkN4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVlVGQlZTeERRVUZETzJGQlF6RkNPMU5CUTBZN1VVRkRSQ3hQUVVGUExFVkJRVU1zVVVGQlVTeEZRVUZGTEVWQlFVVXNSVUZCUlN4SlFVRkpMRmRCUVZjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTEVWQlFVVXNTVUZCU1N4WFFVRlhMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVU1zUTBGQlF6dEpRVU4wUlN4RFFVRkRPMGxCUlUwc1dVRkJXU3hEUVVGRExGbEJRV2RETzFGQlEyeEVMRTFCUVUwc1dVRkJXU3hIUVVGNVF5eEZRVUZGTEVOQlFVTTdVVUZET1VRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUXpsRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEYkVNc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03V1VGRGRrTXNXVUZCV1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRmxCUVZrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEYkVZc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU5zUXl4WlFVRlpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVOMlF5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NXVUZCV1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFRRVU51Ump0UlFVTkVMRTlCUVU4c1dVRkJXU3hEUVVGRE8wbEJRM1JDTEVOQlFVTTdTVUZGVHl4UlFVRlJMRU5CUVVNc1dVRkJaME1zUlVGQlJTeExRVUZoTzFGQlF6bEVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4TFFVRkxMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VSXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEyeENMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdXVUZEZGtJc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVlVGQlZTeERRVUZETzFOQlF5OURPMGxCUTBnc1EwRkJRenRKUVVWUExGTkJRVk1zUTBGQlF5eFpRVUZuUXp0UlFVTm9SQ3hMUVVGTExFMUJRVTBzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFVkJRVVU3V1VGRGVrTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1dVRkJXU3hEUVVGRExFTkJRVkVzUTBGQlF5eERRVUZETzFsQlEyNURMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6dFpRVU5hTEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTTdaMEpCUXpsQ0xFZEJRVWNzU1VGQlNTeEhRVUZITEVOQlFVTXNRMEZCVVN4RFFVRkRMRU5CUVVNN1dVRkRka0lzU1VGQlNTeEhRVUZITEV0QlFVc3NRMEZCUXp0blFrRkJSU3hUUVVGVE8xbEJRM2hDTEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTTdaMEpCUXpsQ0xGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1NVRkJTU3hIUVVGSExFTkJRVU03VTBGRE0wTTdTVUZEU0N4RFFVRkRPMGxCUlU4c1RVRkJUU3hEUVVGRExGbEJRV2RETEVWQlFVVXNTMEZCWVR0UlFVTTFSQ3hOUVVGTkxHTkJRV01zUjBGQmRVSXNSVUZCUlN4RFFVRkRPMUZCUXpsRExFMUJRVTBzUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRXRCUVVzc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUXpkRUxFMUJRVTBzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzSkRMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4TFFVRkxMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VSXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEyeENMRk5CUVZNN1dVRkRXQ3dyUWtGQkswSTdXVUZETDBJc1kwRkJZeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0WlFVTjJRaXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1MwRkJTeXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzJkQ1FVTTVRaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRE8yOUNRVU4yUWl4VFFVRlRPMmRDUVVOWUxFMUJRVTBzUjBGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMR05CUVdNN1owSkJRMjVGTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhIUVVGSExFZEJRVWNzVVVGQlVTeERRVUZETEVkQlFVY3NVVUZCVVN4SFFVRkhMRU5CUVVNc1JVRkJSVHR2UWtGRE4wTXNZMEZCWXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVkQlFVY3NRMEZCUXp0dlFrRkRNMElzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2QwSkJRM0JDTEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03YjBKQlEzcENMR05CUVdNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNN2FVSkJRelZDTzJGQlEwWTdVMEZEUmp0UlFVTkVMRTlCUVU4c1kwRkJZeXhEUVVGRE8wbEJRM2hDTEVOQlFVTTdTVUZGUkN4dFJFRkJiVVE3U1VGRmJrUXNTVUZCU1R0SlFVVkpMRTlCUVU4c1EwRkJReXhaUVVGblF6dFJRVU01UXl4TFFVRkxMRTFCUVUwc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRVZCUVVVN1dVRkRla01zVFVGQlRTeEhRVUZITEVkQlFVY3NXVUZCV1N4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRE8xbEJRMjVETEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTTdaMEpCUXpsQ0xGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRlJMRU5CUVVNc1EwRkJReXhEUVVGUkxFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8xTkJRemxITzBsQlEwZ3NRMEZCUXp0SlFVVlBMR05CUVdNc1EwRkJReXhaUVVGblF5eEZRVUZGTEVOQlFVMHNSVUZCUlN4RFFVRk5PMUZCUTNKRkxFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTmFMRTFCUVUwc1kwRkJZeXhIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF5eERRVUZETzFGQlF6RkVMRTFCUVUwc1dVRkJXU3hIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF5eERRVUZETzFGQlEzaEVMRXRCUVVzc1RVRkJUU3hEUVVGRExFbEJRVWtzWTBGQll5eEZRVUZGTzFsQlF6bENMRWxCUVVrc1dVRkJXU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUXpGQ0xFZEJRVWNzU1VGQlNTeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJVU3hEUVVGRExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRE8xTkJRMmhGTzFGQlEwUXNUMEZCVHl4SFFVRkhMRU5CUVVNN1NVRkRZaXhEUVVGRE8wTkJRMFlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnZTFOd1lYSnpaVTFoZEhKcGVGSmxjM1ZzZEgwZ1puSnZiU0FuTGk0dlpHbHpkR0Z1WTJVdGJXRjBjbWw0TDNOd1lYSnpaUzF0WVhSeWFYZ3RjMlZ5ZG1salpTYzdYRzVwYlhCdmNuUWdlMkpwYjB4aGVXOTFkSDBnWm5KdmJTQW5MaTlpYVc4dGJHRjViM1YwSnp0Y2JtbHRjRzl5ZENCN1RVTk1UM0IwYVc5dWN5d2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBmU0JtY205dElDY3VMM1I1Y0dWekp6dGNibHh1Wlhod2IzSjBJR052Ym5OMElHUmxabUYxYkhSTlEweFBjSFJwYjI1ek9pQk5RMHhQY0hScGIyNXpJRDBnZTF4dUlDQmxlSEJoYm1SR1lXTjBiM0k2SURJc1hHNGdJRzFoZUVsMFpYSmhkR2x2Ym5NNklEVXNYRzRnSUdsdVpteGhkR1ZHWVdOMGIzSTZJRElzWEc0Z0lHMTFiSFJHWVdOMGIzSTZJREVzWEc1OU8xeHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1RVTk1VM0JoY25ObFVtVmtkV05sY2lCN1hHNGdJSEJ5YVhaaGRHVWdYMjl3ZEdsdmJuTTZJRTFEVEU5d2RHbHZibk03WEc1Y2JpQWdZMjl1YzNSeWRXTjBiM0lvYjNCMGN6b2dVR0Z5ZEdsaGJEeE5RMHhQY0hScGIyNXpQaUE5SUh0OUtTQjdYRzRnSUNBZ2RHaHBjeTVmYjNCMGFXOXVjeUE5SUhzdUxpNWtaV1poZFd4MFRVTk1UM0IwYVc5dWN5d2dMaTR1YjNCMGMzMDdYRzRnSUgxY2JseHVJQ0J3ZFdKc2FXTWdZWE41Ym1NZ2RISmhibk5tYjNKdEtITndZWEp6WlUxaGRISnBlRG9nVTNCaGNuTmxUV0YwY21sNFVtVnpkV3gwTENCdVVtOTNjem9nYm5WdFltVnlLU0I3WEc0Z0lDQWdMeThnZEdWemRGZHZjbXRsY2sxMWJIUnBjR3g1S0NrN1hHNGdJQ0FnTHk4Z2NtVjBkWEp1SUc1bGR5QkpiblF6TWtGeWNtRjVLRzVTYjNkektUdGNiaUFnSUNCc1pYUWdjM0JoY25ObFQySnFaV04wSUQwZ2RHaHBjeTUwYjA5aWFtVmpkRVp2Y20wb2MzQmhjbk5sVFdGMGNtbDRLVHRjYmlBZ0lDQnBaaUFvZEdocGN5NWZiM0IwYVc5dWN5NXRZWGhKZEdWeVlYUnBiMjV6SUQ0Z01Da2dlMXh1SUNBZ0lDQWdkR2hwY3k1aFpHUk1iMjl3Y3loemNHRnljMlZQWW1wbFkzUXNJRzVTYjNkektUdGNiaUFnSUNBZ0lIUm9hWE11Ym05eWJXRnNhWHBsS0hOd1lYSnpaVTlpYW1WamRDazdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJSFJvYVhNdVgyOXdkR2x2Ym5NdWJXRjRTWFJsY21GMGFXOXVjenNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJSE53WVhKelpVOWlhbVZqZENBOUlIUm9hWE11Wlhod1lXNWtLSE53WVhKelpVOWlhbVZqZEN3Z2JsSnZkM01wTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbWx1Wm14aGRHVW9jM0JoY25ObFQySnFaV04wS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV1YjNKdFlXeHBlbVVvYzNCaGNuTmxUMkpxWldOMEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnWTI5dWMzUWdlMk5zZFhOMFpYSnpMQ0JwY3l3Z2FuTjlJRDBnZEdocGN5NWhjM05wWjI1RGJIVnpkR1Z5Y3loemNHRnljMlZQWW1wbFkzUXNJRzVTYjNkektUdGNiaUFnSUNCMGFHbHpMbU52Y25KbFkzUkRiSFZ6ZEdWeWN5aGpiSFZ6ZEdWeWN5azdYRzRnSUNBZ1kyOXVjM1FnWlcxaVpXUmthVzVuY3lBOUlHRjNZV2wwSUhSb2FYTXViR0Y1YjNWMEtHTnNkWE4wWlhKekxDQnpjR0Z5YzJWUFltcGxZM1FzSUc1U2IzZHpLVHRjYmlBZ0lDQnlaWFIxY200Z2UyTnNkWE4wWlhKekxDQmxiV0psWkZnNklHVnRZbVZrWkdsdVozTXVaVzFpWldSWUxDQmxiV0psWkZrNklHVnRZbVZrWkdsdVozTXVaVzFpWldSWkxDQnBjeXdnYW5OOU8xeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQmpiM0p5WldOMFEyeDFjM1JsY25Nb1kyeDFjM1JsY25NNklHNTFiV0psY2x0ZEtTQjdYRzRnSUNBZ1kyOXVjM1FnWTJ4MWMzUmxjbE5wZW1WTllYQTZJSHRiWHpvZ2JuVnRZbVZ5WFRvZ2JuVnRZbVZ5ZlNBOUlIdDlPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdZMngxYzNSbGNpQnZaaUJqYkhWemRHVnljeWtnZTF4dUlDQWdJQ0FnYVdZZ0tDRmpiSFZ6ZEdWeVUybDZaVTFoY0Z0amJIVnpkR1Z5WFNsY2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY2xOcGVtVk5ZWEJiWTJ4MWMzUmxjbDBnUFNBd08xeHVJQ0FnSUNBZ1kyeDFjM1JsY2xOcGVtVk5ZWEJiWTJ4MWMzUmxjbDByS3p0Y2JpQWdJQ0I5WEc0Z0lDQWdZMjl1YzNRZ2MyOXlkR1ZrU1c1a1pYaGxjeUE5SUU5aWFtVmpkQzVyWlhsektHTnNkWE4wWlhKVGFYcGxUV0Z3S1M1dFlYQW9UblZ0WW1WeUtTNXpiM0owS0NoaExDQmlLU0E5UGlCamJIVnpkR1Z5VTJsNlpVMWhjRnRoWFNBdElHTnNkWE4wWlhKVGFYcGxUV0Z3VzJKZEtUdGNiaUFnSUNCamIyNXpkQ0JqYkhWemRHVnlUV0Z3T2lCN1cxODZJRzUxYldKbGNsMDZJRzUxYldKbGNuMGdQU0I3ZlR0Y2JpQWdJQ0J6YjNKMFpXUkpibVJsZUdWekxtWnZja1ZoWTJnb0tHTnNkWE4wWlhKSlpIZ3NJR2twSUQwK0lHTnNkWE4wWlhKTllYQmJZMngxYzNSbGNrbGtlRjBnUFNCcElDc2dNU2s3WEc0Z0lDQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0JqYkhWemRHVnljeTVzWlc1bmRHZzdJR2tyS3lsY2JpQWdJQ0FnSUdOc2RYTjBaWEp6VzJsZElEMGdZMngxYzNSbGNrMWhjRnRqYkhWemRHVnljMXRwWFYwN1hHNGdJQ0FnTHk4Z2JHVjBJR04xY2tOc2RYTjBaWElnUFNBeE8xeHVJQ0FnSUM4dklHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dZMngxYzNSbGNuTXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0F2THlBZ0lHbG1JQ2doWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5YzF0cFhWMHBJSHRjYmlBZ0lDQXZMeUFnSUNBZ1kyeDFjM1JsY2sxaGNGdGpiSFZ6ZEdWeWMxdHBYVjBnUFNCamRYSkRiSFZ6ZEdWeU8xeHVJQ0FnSUM4dklDQWdJQ0JqYkhWemRHVnljMXRwWFNBOUlHTjFja05zZFhOMFpYSTdYRzRnSUNBZ0x5OGdJQ0FnSUdOMWNrTnNkWE4wWlhJckt6dGNiaUFnSUNBdkx5QWdJSDBnWld4elpTQjdYRzRnSUNBZ0x5OGdJQ0FnSUdOc2RYTjBaWEp6VzJsZElEMGdZMngxYzNSbGNrMWhjRnRqYkhWemRHVnljMXRwWFYwN1hHNGdJQ0FnTHk4Z0lDQjlYRzRnSUNBZ0x5OGdmVnh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0JoYzNsdVl5QnNZWGx2ZFhRb1kyeDFjM1JsY25NNklHNTFiV0psY2x0ZExDQnpjR0Z5YzJWTllYUnlhWGc2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2JsSnZkM002SUc1MWJXSmxjaWtnZTF4dUlDQWdJR052Ym5OMElHVnRZbVZrV0NBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb2JsSnZkM01wTG1acGJHd29NQ2s3WEc0Z0lDQWdZMjl1YzNRZ1pXMWlaV1JaSUQwZ2JtVjNJRVpzYjJGME16SkJjbkpoZVNodVVtOTNjeWt1Wm1sc2JDZ3dLVHRjYmlBZ0lDQmpiMjV6ZENCamJIVnpkR1Z5VFdGd09pQjdXMTg2SUc1MWJXSmxjbDA2SUc1MWJXSmxjbHRkZlNBOUlIdDlPMXh1SUNBZ0lHTnNkWE4wWlhKekxtWnZja1ZoWTJnb0tHTnNkWE4wWlhJc0lHa3BJRDArSUh0Y2JpQWdJQ0FnSUdsbUlDZ2hZMngxYzNSbGNrMWhjRnRqYkhWemRHVnlYU2xjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5WFNBOUlGdGRPMXh1SUNBZ0lDQWdZMngxYzNSbGNrMWhjRnRqYkhWemRHVnlYUzV3ZFhOb0tHa3BPMXh1SUNBZ0lIMHBPMXh1SUNBZ0lDOHZJR052Ym5OMElHNURiSFZ6ZEdWeWN5QTlJRTlpYW1WamRDNXJaWGx6S0dOc2RYTjBaWEpOWVhBcExteGxibWQwYUR0Y2JpQWdJQ0F2THlCamIyNXpkQ0J3WlhKU2IzY2dQU0JOWVhSb0xtWnNiMjl5S0UxaGRHZ3VjM0Z5ZENodVEyeDFjM1JsY25NcEtUdGNiaUFnSUNCc1pYUWdZMngxYzNSbGNrNTFiU0E5SURBN1hHNGdJQ0FnWTI5dWMzUWdjMjl5ZEdWa1EyeDFjM1JsY2s1aGJXVnpJRDBnVDJKcVpXTjBMbXRsZVhNb1kyeDFjM1JsY2sxaGNDazdYRzRnSUNBZ2MyOXlkR1ZrUTJ4MWMzUmxjazVoYldWekxuTnZjblFvS0dFc0lHSXBJRDArSUdOc2RYTjBaWEpOWVhCYllpQmhjeUJoYm5sZExteGxibWQwYUNBdElHTnNkWE4wWlhKTllYQmJZU0JoY3lCaGJubGRMbXhsYm1kMGFDazdYRzRnSUNBZ2JHVjBJSEJsY2xKdmR5QTlJRFk3WEc1Y2JpQWdJQ0JzWlhRZ2VVOW1abk5sZENBOUlEQTdYRzRnSUNBZ1kyOXVjM1FnYkdGNWIzVjBVMmw2WlNBOUlEVTdYRzRnSUNBZ1ptOXlJQ2hqYjI1emRDQmpiSFZ6ZEdWeVRtRnRaU0J2WmlCemIzSjBaV1JEYkhWemRHVnlUbUZ0WlhNcElIdGNiaUFnSUNBZ0lHTnZibk4wSUdOc2RYTjBaWElnUFNCamJIVnpkR1Z5VFdGd1cyTnNkWE4wWlhKT1lXMWxJR0Z6SUdGdWVWMGhPMXh1SUNBZ0lDQWdZMjl1YzNRZ1pXMWlaV1JrYVc1bmN5QTlJR0YzWVdsMElHSnBiMHhoZVc5MWRDaGpiSFZ6ZEdWeUxDQnpjR0Z5YzJWTllYUnlhWGdzSURBdU1EQXhLVHRjYmlBZ0lDQWdJR2xtSUNoamJIVnpkR1Z5VG5WdElEMDlQU0JOWVhSb0xtTmxhV3dvY0dWeVVtOTNJQzhnTVM0MUtTa2dlMXh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlUblZ0SUQwZ01EdGNiaUFnSUNBZ0lDQWdlVTltWm5ObGRDQXJQU0JzWVhsdmRYUlRhWHBsSUM4Z2NHVnlVbTkzTzF4dUlDQWdJQ0FnSUNCd1pYSlNiM2NnUFNCTllYUm9MbU5sYVd3b2NHVnlVbTkzSUNvZ01TNDFLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR052Ym5OMElHOW1abk5sZEZnZ1BTQW9LR05zZFhOMFpYSk9kVzBnSlNCd1pYSlNiM2NwSUNvZ2JHRjViM1YwVTJsNlpTQXZJSEJsY2xKdmR5a2dLaUF4TGpVN1hHNGdJQ0FnSUNBdkx5QmpiMjV6ZENCdlptWnpaWFJaSUQwZ1RXRjBhQzVtYkc5dmNpaGpiSFZ6ZEdWeVRuVnRJQzhnY0dWeVVtOTNLU0FxSURJN1hHNWNiaUFnSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2daVzFpWldSa2FXNW5jeTVsYldKbFpGZ3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ1pXMWlaV1JZVzJOc2RYTjBaWEpiYVYxZElEMGdaVzFpWldSa2FXNW5jeTVsYldKbFpGaGJhVjBnS2lCc1lYbHZkWFJUYVhwbElDOGdjR1Z5VW05M0lDc2diMlptYzJWMFdEdGNiaUFnSUNBZ0lDQWdaVzFpWldSWlcyTnNkWE4wWlhKYmFWMWRJRDBnWlcxaVpXUmthVzVuY3k1bGJXSmxaRmxiYVYwZ0tpQnNZWGx2ZFhSVGFYcGxJQzhnY0dWeVVtOTNJQ3NnZVU5bVpuTmxkRHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR05zZFhOMFpYSk9kVzByS3p0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlIdGxiV0psWkZnc0lHVnRZbVZrV1gwN1hHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElHMWxjbWRsUTJ4MWMzUmxjbk1vWTJ4MWMzUmxjbk02SUc1MWJXSmxjbHRkTENCcE9pQnVkVzFpWlhJc0lHbzZJRzUxYldKbGNpa2dlMXh1SUNBZ0lHTnZibk4wSUdsRGJIVnpkR1Z5SUQwZ1kyeDFjM1JsY25OYmFWMDdYRzRnSUNBZ1kyOXVjM1FnYWtOc2RYTjBaWElnUFNCamJIVnpkR1Z5YzF0cVhUdGNiaUFnSUNCbWIzSWdLR3hsZENCcklEMGdNRHNnYXlBOElHTnNkWE4wWlhKekxteGxibWQwYURzZ2F5c3JLU0I3WEc0Z0lDQWdJQ0JwWmlBb1kyeDFjM1JsY25OYmExMGdQVDA5SUdwRGJIVnpkR1Z5S1Z4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5YzF0clhTQTlJR2xEYkhWemRHVnlPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQndkV0pzYVdNZ1lYTnphV2R1UTJ4MWMzUmxjbk1vYzNCaGNuTmxUV0YwY21sNE9pQlRjR0Z5YzJWTllYUnlhWGhQWW1wbFkzUXNJRzVTYjNkek9pQnVkVzFpWlhJcElIdGNiaUFnSUNCc1pYUWdZMngxYzNSbGNrNTFiU0E5SURBN1hHNGdJQ0FnWTI5dWMzUWdhWE02SUc1MWJXSmxjbHRkSUQwZ1cxMDdYRzRnSUNBZ1kyOXVjM1FnYW5NNklHNTFiV0psY2x0ZElEMGdXMTA3WEc0Z0lDQWdZMjl1YzNRZ2IzSmtaWElnUFNCTllYUm9MbVpzYjI5eUtFMWhkR2d1YldGNEtFMWhkR2d1Ykc5bk1UQW9ibEp2ZDNNcExDQXlLU2tnS3lBeE8xeHVJQ0FnSUdOdmJuTjBJRzFwYms5eVpHVnlJRDBnVFdGMGFDNXdiM2NvTVRBc0lHOXlaR1Z5S1R0Y2JpQWdJQ0JqYjI1emRDQmpiSFZ6ZEdWeWN6b2diblZ0WW1WeVcxMGdQU0J1WlhjZ1FYSnlZWGtvYmxKdmQzTXBMbVpwYkd3b0xURXBPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdhU0J2WmlCUFltcGxZM1F1YTJWNWN5aHpjR0Z5YzJWTllYUnlhWGdwS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElHb2diMllnVDJKcVpXTjBMbXRsZVhNb2MzQmhjbk5sVFdGMGNtbDRXMmtnWVhNZ1lXNTVYU2twSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRTFoZEdndWNtOTFibVFvYzNCaGNuTmxUV0YwY21sNFcya2dZWE1nWVc1NVhWdHFJR0Z6SUdGdWVWMGdLaUJ0YVc1UGNtUmxjaWtnTHlCdGFXNVBjbVJsY2lBK0lEQWdKaVpjYmlBZ0lDQWdJQ0FnSUNCemNHRnljMlZOWVhSeWFYaGJhU0JoY3lCaGJubGRXMm9nWVhNZ1lXNTVYU0FoUFQwZ1RuVnRZbVZ5S0drcElDWW1JRTUxYldKbGNpaHFLU0ErSUU1MWJXSmxjaWhwS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJR2x6TG5CMWMyZ29UblZ0WW1WeUtHa3BLVHRjYmlBZ0lDQWdJQ0FnSUNCcWN5NXdkWE5vS0U1MWJXSmxjaWhxS1NrN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0dOc2RYTjBaWEp6VzA1MWJXSmxjaWhwS1YwZ0lUMDlJQzB4SUNZbUlHTnNkWE4wWlhKelcwNTFiV0psY2locUtWMGdJVDA5SUMweEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZMngxYzNSbGNuTmJUblZ0WW1WeUtHa3BYU0FoUFQwZ1kyeDFjM1JsY25OYlRuVnRZbVZ5S0dvcFhTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV0WlhKblpVTnNkWE4wWlhKektHTnNkWE4wWlhKekxDQk9kVzFpWlhJb2FTa3NJRTUxYldKbGNpaHFLU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FTbGRJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYlRuVnRZbVZ5S0dvcFhTQTlJR05zZFhOMFpYSnpXMDUxYldKbGNpaHBLVjA3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FpbGRJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYlRuVnRZbVZ5S0drcFhTQTlJR05zZFhOMFpYSnpXMDUxYldKbGNpaHFLVjA3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSk9kVzByS3p0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMDUxYldKbGNpaHBLVjBnUFNCamJIVnpkR1Z5VG5WdE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjbk5iVG5WdFltVnlLR29wWFNBOUlHTnNkWE4wWlhKT2RXMDdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJR1p2Y2lBb2JHVjBJR2s5TURzZ2FTQThJR05zZFhOMFpYSnpMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9ZMngxYzNSbGNuTmJhVjBnUFQwOUlDMHhLU0I3WEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpPZFcwZ0t5czdYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMmxkSUQwZ1kyeDFjM1JsY2s1MWJUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSHRqYkhWemRHVnljeXdnYVhNNklHNWxkeUJWYVc1ME16SkJjbkpoZVNocGN5a3NJR3B6T2lCdVpYY2dWV2x1ZERNeVFYSnlZWGtvYW5NcGZUdGNiaUFnZlZ4dVhHNGdJSEIxWW14cFl5QjBiMDlpYW1WamRFWnZjbTBvYzNCaGNuTmxUV0YwY21sNE9pQlRjR0Z5YzJWTllYUnlhWGhTWlhOMWJIUXBPaUJUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1FnZTF4dUlDQWdJR052Ym5OMElITndZWEp6WlU5aWFtVmpkRG9nZTF0Zk9pQnVkVzFpWlhKZE9pQjdXMTg2SUc1MWJXSmxjbDA2SUc1MWJXSmxjbjE5SUQwZ2UzMDdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnpjR0Z5YzJWTllYUnlhWGd1YVM1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGemNHRnljMlZQWW1wbFkzUmJjM0JoY25ObFRXRjBjbWw0TG1sYmFWMWRLVnh1SUNBZ0lDQWdJQ0J6Y0dGeWMyVlBZbXBsWTNSYmMzQmhjbk5sVFdGMGNtbDRMbWxiYVYxZElEMGdlMzA3WEc0Z0lDQWdJQ0J6Y0dGeWMyVlBZbXBsWTNSYmMzQmhjbk5sVFdGMGNtbDRMbWxiYVYxZFczTndZWEp6WlUxaGRISnBlQzVxVzJsZFhTQTlJREVnTFNCemNHRnljMlZOWVhSeWFYZ3VaR2x6ZEdGdVkyVmJhVjA3WEc0Z0lDQWdJQ0JwWmlBb0lYTndZWEp6WlU5aWFtVmpkRnR6Y0dGeWMyVk5ZWFJ5YVhndWFsdHBYVjBwWEc0Z0lDQWdJQ0FnSUhOd1lYSnpaVTlpYW1WamRGdHpjR0Z5YzJWTllYUnlhWGd1YWx0cFhWMGdQU0I3ZlR0Y2JpQWdJQ0FnSUhOd1lYSnpaVTlpYW1WamRGdHpjR0Z5YzJWTllYUnlhWGd1YWx0cFhWMWJjM0JoY25ObFRXRjBjbWw0TG1sYmFWMWRJRDBnTVNBdElITndZWEp6WlUxaGRISnBlQzVrYVhOMFlXNWpaVnRwWFR0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlITndZWEp6WlU5aWFtVmpkRHRjYmlBZ2ZWeHVYRzRnSUhCeWFYWmhkR1VnWVdSa1RHOXZjSE1vYzNCaGNuTmxUMkpxWldOME9pQlRjR0Z5YzJWTllYUnlhWGhQWW1wbFkzUXNJRzVTYjNkek9pQnVkVzFpWlhJcElIdGNiaUFnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHNVNiM2R6T3lCcEt5c3BJSHRjYmlBZ0lDQWdJR2xtSUNnaGMzQmhjbk5sVDJKcVpXTjBXMmxkS1Z4dUlDQWdJQ0FnSUNCemNHRnljMlZQWW1wbFkzUmJhVjBnUFNCN2ZUdGNiaUFnSUNBZ0lITndZWEp6WlU5aWFtVmpkRnRwWFZ0cFhTQTlJSFJvYVhNdVgyOXdkR2x2Ym5NdWJYVnNkRVpoWTNSdmNqdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElHNXZjbTFoYkdsNlpTaHpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZENrZ2UxeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ2FTQnZaaUJQWW1wbFkzUXVhMlY1Y3loemNHRnljMlZQWW1wbFkzUXBLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQnliM2NnUFNCemNHRnljMlZQWW1wbFkzUmJhU0JoY3lCaGJubGRPMXh1SUNBZ0lDQWdiR1YwSUhOMWJTQTlJREE3WEc0Z0lDQWdJQ0JtYjNJZ0tHTnZibk4wSUdvZ2IyWWdUMkpxWldOMExtdGxlWE1vY205M0tTbGNiaUFnSUNBZ0lDQWdjM1Z0SUNzOUlISnZkMXRxSUdGeklHRnVlVjA3WEc0Z0lDQWdJQ0JwWmlBb2MzVnRJRDA5UFNBd0tTQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lHWnZjaUFvWTI5dWMzUWdhaUJ2WmlCUFltcGxZM1F1YTJWNWN5aHliM2NwS1Z4dUlDQWdJQ0FnSUNCemNHRnljMlZQWW1wbFkzUmJhU0JoY3lCaGJubGRXMm9nWVhNZ1lXNTVYU0F2UFNCemRXMDdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQmxlSEJoYm1Rb2MzQmhjbk5sVDJKcVpXTjBPaUJUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1FzSUc1U2IzZHpPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQmpiMjV6ZENCbGVIQmhibVJsWkU5aWFtVmpkRG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wSUQwZ2UzMDdYRzRnSUNBZ1kyOXVjM1FnYjNKa1pYSWdQU0JOWVhSb0xtWnNiMjl5S0UxaGRHZ3ViV0Y0S0UxaGRHZ3ViRzluTVRBb2JsSnZkM01wTENBeUtTa2dLeUF4TzF4dUlDQWdJR052Ym5OMElHMXBiazl5WkdWeUlEMGdUV0YwYUM1d2IzY29NVEFzSUc5eVpHVnlLVHRjYmlBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJRzVTYjNkek95QnBLeXNwSUh0Y2JpQWdJQ0FnSUdsbUlDZ2hjM0JoY25ObFQySnFaV04wVzJsZEtWeHVJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDOHZJR052Ym5OMElISnZkeUE5SUhOd1lYSnpaVTlpYW1WamRGdHBYVHRjYmlBZ0lDQWdJR1Y0Y0dGdVpHVmtUMkpxWldOMFcybGRJRDBnZTMwN1hHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcUlEMGdhVHNnYWlBOElHNVNiM2R6T3lCcUt5c3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tDRnpjR0Z5YzJWUFltcGxZM1JiYVYwL0xsdHFYU2xjYmlBZ0lDQWdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnZG1Gc0lEMGdkR2hwY3k1blpYUkZlSEJoYm1SV1lXeDFaU2h6Y0dGeWMyVlBZbXBsWTNRc0lHa3NJR29wT3lBdkwzQnlkVzVwYm1jZ2MzUmxjRnh1SUNBZ0lDQWdJQ0JwWmlBb1RXRjBhQzV5YjNWdVpDaDJZV3dnS2lCdGFXNVBjbVJsY2lrZ0x5QnRhVzVQY21SbGNpQStJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQmxlSEJoYm1SbFpFOWlhbVZqZEZ0cFhWdHFYU0E5SUhaaGJEdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb0lXVjRjR0Z1WkdWa1QySnFaV04wVzJwZEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnWlhod1lXNWtaV1JQWW1wbFkzUmJhbDBnUFNCN2ZUdGNiaUFnSUNBZ0lDQWdJQ0JsZUhCaGJtUmxaRTlpYW1WamRGdHFYVnRwWFNBOUlIWmhiRHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1pYaHdZVzVrWldSUFltcGxZM1E3WEc0Z0lIMWNibHh1SUNBdkx5QndjbWwyWVhSbElIQnlkVzVsS0hKdmR6b2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBXMjUxYldKbGNsMHBJSHRjYmx4dUlDQXZMeUI5WEc1Y2JpQWdjSEpwZG1GMFpTQnBibVpzWVhSbEtITndZWEp6WlU5aWFtVmpkRG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wS1NCN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCcElHOW1JRTlpYW1WamRDNXJaWGx6S0hOd1lYSnpaVTlpYW1WamRDa3BJSHRjYmlBZ0lDQWdJR052Ym5OMElISnZkeUE5SUhOd1lYSnpaVTlpYW1WamRGdHBJR0Z6SUdGdWVWMDdYRzRnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJR29nYjJZZ1QySnFaV04wTG10bGVYTW9jbTkzS1NsY2JpQWdJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBXMmtnWVhNZ1lXNTVYVnRxSUdGeklHRnVlVjBnUFNCTllYUm9MbkJ2ZHloemNHRnljMlZQWW1wbFkzUmJhU0JoY3lCaGJubGRXMm9nWVhNZ1lXNTVYU3dnZEdocGN5NWZiM0IwYVc5dWN5NXBibVpzWVhSbFJtRmpkRzl5S1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUdkbGRFVjRjR0Z1WkZaaGJIVmxLSE53WVhKelpVOWlhbVZqZERvZ1UzQmhjbk5sVFdGMGNtbDRUMkpxWldOMExDQnBPaUJoYm5rc0lHbzZJR0Z1ZVNrZ2UxeHVJQ0FnSUd4bGRDQjJZV3dnUFNBd08xeHVJQ0FnSUdOdmJuTjBJR04xY25KbGJuUkpibVJsZUdWeklEMGdUMkpxWldOMExtdGxlWE1vYzNCaGNuTmxUMkpxWldOMFcybGRJRDgvSUh0OUtUdGNiaUFnSUNCamIyNXpkQ0J2ZEdobGNrbHVaR1Y0WlhNZ1BTQlBZbXBsWTNRdWEyVjVjeWh6Y0dGeWMyVlBZbXBsWTNSYmFsMGdQejhnZTMwcE8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ2F5QnZaaUJqZFhKeVpXNTBTVzVrWlhobGN5a2dlMXh1SUNBZ0lDQWdhV1lnS0c5MGFHVnlTVzVrWlhobGN5NXBibU5zZFdSbGN5aHJLU2xjYmlBZ0lDQWdJQ0FnZG1Gc0lDczlJSE53WVhKelpVOWlhbVZqZEZ0cFhWdHJJR0Z6SUdGdWVWMGdLaUJ6Y0dGeWMyVlBZbXBsWTNSYmFsMWJheUJoY3lCaGJubGRPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZG1Gc08xeHVJQ0I5WEc1OVhHNWNiaUpkZlE9PSIsImltcG9ydCB7IG11bHRpQ29sV2ViR1BVU3BhcnNlTWF0cml4IH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvc3BhcnNlLW1hdHJpeC93ZWJHUFUtc3BhcnNlLW1hdHJpeCc7XG5pbXBvcnQgeyBTcGFyc2VNYXRyaXhTZXJ2aWNlIH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3NwYXJzZS1tYXRyaXgtc2VydmljZSc7XG5pbXBvcnQgeyBNQ0xTcGFyc2VSZWR1Y2VyIH0gZnJvbSAnLi9tYXJjb3YtY2x1c3Rlcic7XG5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QsIGRpc3RhbmNlRm5BcmdzLCBkaXN0YW5jZUZucywgbWF4SXRlcmF0aW9ucywgdXNlV2ViR1BVIH0gPSBldmVudC5kYXRhO1xuICAgIGNvbnNvbGUudGltZSgnc3BhcnNlIG1hdHJpeCcpO1xuICAgIGxldCBzcGFyc2UgPSBudWxsO1xuICAgIGlmICh1c2VXZWJHUFUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNwYXJzZSA9IGF3YWl0IG11bHRpQ29sV2ViR1BVU3BhcnNlTWF0cml4KGRhdGEsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbnMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzLCBkaXN0YW5jZUZuQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFzcGFyc2UpIHsgLy8gZmFsc2JhY2sgdG8gQ1BVXG4gICAgICAgIGlmICh1c2VXZWJHUFUpXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXRUJHUFUgc3BhcnNlIG1hdHJpeCBjYWxjdWxhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBDUFUgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgc3BhcnNlID0gYXdhaXQgbmV3IFNwYXJzZU1hdHJpeFNlcnZpY2UoKVxuICAgICAgICAgICAgLmNhbGNNdWx0aUNvbHVtbihkYXRhLCBkaXN0YW5jZUZucywgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZuQXJncywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICAgIH1cbiAgICBjb25zb2xlLnRpbWVFbmQoJ3NwYXJzZSBtYXRyaXgnKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBuZXcgTUNMU3BhcnNlUmVkdWNlcih7IG1heEl0ZXJhdGlvbnM6IG1heEl0ZXJhdGlvbnMgPz8gNSB9KS50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gICAgcG9zdE1lc3NhZ2UoeyByZXMgfSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldOc0xYZHZjbXRsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbTFqYkMxM2IzSnJaWEl1ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNUMEZCVHl4RlFVRkRMREJDUVVFd1FpeEZRVUZETEUxQlFVMHNkMFZCUVhkRkxFTkJRVU03UVVGRGJFZ3NUMEZCVHl4RlFVRnhRaXh0UWtGQmJVSXNSVUZCUXl4TlFVRk5MREJEUVVFd1F5eERRVUZETzBGQlIycEhMRTlCUVU4c1JVRkJReXhuUWtGQlowSXNSVUZCUXl4TlFVRk5MR3RDUVVGclFpeERRVUZETzBGQlJXeEVMRk5CUVZNc1IwRkJSeXhMUVVGTExFVkJRVVVzUzBGQlN5eEZRVUZGTEVWQlFVVTdTVUZETVVJc1RVRkJUU3hGUVVGRExFbEJRVWtzUlVGQlJTeFRRVUZUTEVWQlFVVXNUMEZCVHl4RlFVRkZMR2xDUVVGcFFpeEZRVUZGTEdOQlFXTXNSVUZCUlN4WFFVRlhMRVZCUVVVc1lVRkJZU3hGUVVGRkxGTkJRVk1zUlVGQlF5eEhRVWRPTEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNN1NVRkZMMGNzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4bFFVRmxMRU5CUVVNc1EwRkJRenRKUVVNNVFpeEpRVUZKTEUxQlFVMHNSMEZCT0VJc1NVRkJTU3hEUVVGRE8wbEJRemRETEVsQlFVa3NVMEZCVXl4RlFVRkZPMUZCUTJJc1NVRkJTVHRaUVVOR0xFMUJRVTBzUjBGQlJ5eE5RVUZOTERCQ1FVRXdRaXhEUVVOMlF5eEpRVUZKTEVWQlFVVXNVMEZCVXl4SFFVRkhMRWRCUVVjc1JVRkJSU3hYUVVGclFpeEZRVUZGTEdsQ1FVRjNRaXhGUVVGRkxFOUJRVThzUlVGQlJTeGpRVUZqTEVOQlFVTXNRMEZCUXp0VFFVTnFSenRSUVVGRExFOUJRVThzUTBGQlF5eEZRVUZGTzFsQlExWXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFRRVU5zUWp0TFFVTkdPMGxCUTBRc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeEZRVUZGTEd0Q1FVRnJRanRSUVVNdlFpeEpRVUZKTEZOQlFWTTdXVUZEV0N4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExEWkZRVUUyUlN4RFFVRkRMRU5CUVVNN1VVRkZMMFlzVFVGQlRTeEhRVUZITEUxQlFVMHNTVUZCU1N4dFFrRkJiVUlzUlVGQlJUdGhRVU55UXl4bFFVRmxMRU5CUVVNc1NVRkJTU3hGUVVGRkxGZEJRVmNzUlVGQlJTeFRRVUZUTEVkQlFVY3NSMEZCUnl4RlFVRkZMR05CUVdNc1JVRkJSU3hQUVVGUExFVkJRVVVzYVVKQlFXbENMRU5CUVVNc1EwRkJRenRMUVVOd1J6dEpRVU5FTEU5QlFVOHNRMEZCUXl4UFFVRlBMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU03U1VGRmFrTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1RVRkJUU3hKUVVGSkxHZENRVUZuUWl4RFFVRkRMRVZCUVVNc1lVRkJZU3hGUVVGRkxHRkJRV0VzU1VGQlNTeERRVUZETEVWQlFVTXNRMEZCUXl4RFFVRkRMRk5CUVZNc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wbEJRemxITEZkQlFWY3NRMEZCUXl4RlFVRkRMRWRCUVVjc1JVRkJReXhEUVVGRExFTkJRVU03UVVGRGNrSXNRMEZCUXl4RFFVRkRJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHR0ZFd4MGFVTnZiRmRsWWtkUVZWTndZWEp6WlUxaGRISnBlSDBnWm5KdmJTQW5RR1JoZEdGbmNtOXJMV3hwWW5KaGNtbGxjeTl0WVhSb0wzTnlZeTkzWldKSFVGVXZjM0JoY25ObExXMWhkSEpwZUM5M1pXSkhVRlV0YzNCaGNuTmxMVzFoZEhKcGVDYzdYRzVwYlhCdmNuUWdlMU53WVhKelpVMWhkSEpwZUZKbGMzVnNkQ3dnVTNCaGNuTmxUV0YwY21sNFUyVnlkbWxqWlgwZ1puSnZiU0FuTGk0dlpHbHpkR0Z1WTJVdGJXRjBjbWw0TDNOd1lYSnpaUzF0WVhSeWFYZ3RjMlZ5ZG1salpTYzdYRzVwYlhCdmNuUWdlMFJwYzNSaGJtTmxRV2RuY21WbllYUnBiMjVOWlhSb2IyUjlJR1p5YjIwZ0p5NHVMMlJwYzNSaGJtTmxMVzFoZEhKcGVDOTBlWEJsY3ljN1hHNXBiWEJ2Y25RZ2UwdHViM2R1VFdWMGNtbGpjMzBnWm5KdmJTQW5MaTR2ZEhsd1pXUXRiV1YwY21samN5YzdYRzVwYlhCdmNuUWdlMDFEVEZOd1lYSnpaVkpsWkhWalpYSjlJR1p5YjIwZ0p5NHZiV0Z5WTI5MkxXTnNkWE4wWlhJbk8xeHVYRzV2Ym0xbGMzTmhaMlVnUFNCaGMzbHVZeUFvWlhabGJuUXBJRDArSUh0Y2JpQWdZMjl1YzNRZ2UyUmhkR0VzSUhSb2NtVnphRzlzWkN3Z2QyVnBaMmgwY3l3Z1lXZG5jbVZuWVhScGIyNU5aWFJvYjJRc0lHUnBjM1JoYm1ObFJtNUJjbWR6TENCa2FYTjBZVzVqWlVadWN5d2diV0Y0U1hSbGNtRjBhVzl1Y3l3Z2RYTmxWMlZpUjFCVmZUcGNiaUFnSUh0a1lYUmhPaUJoYm5sYlhWdGRMQ0IwYUhKbGMyaHZiR1E2SUc1MWJXSmxjaXhjYmlBZ0lDQjNaV2xuYUhSek9pQnVkVzFpWlhKYlhTd2dZV2RuY21WbllYUnBiMjVOWlhSb2IyUTZJRVJwYzNSaGJtTmxRV2RuY21WbllYUnBiMjVOWlhSb2IyUXNYRzRnSUNBZ1pHbHpkR0Z1WTJWR2JuTTZJRXR1YjNkdVRXVjBjbWxqYzF0ZExDQmthWE4wWVc1alpVWnVRWEpuY3pvZ1lXNTVXMTBzSUcxaGVFbDBaWEpoZEdsdmJuTTZJRzUxYldKbGNpd2dkWE5sVjJWaVIxQlZQem9nWW05dmJHVmhibjBnUFNCbGRtVnVkQzVrWVhSaE8xeHVYRzRnSUdOdmJuTnZiR1V1ZEdsdFpTZ25jM0JoY25ObElHMWhkSEpwZUNjcE8xeHVJQ0JzWlhRZ2MzQmhjbk5sT2lCVGNHRnljMlZOWVhSeWFYaFNaWE4xYkhRZ2ZDQnVkV3hzSUQwZ2JuVnNiRHRjYmlBZ2FXWWdLSFZ6WlZkbFlrZFFWU2tnZTF4dUlDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNCemNHRnljMlVnUFNCaGQyRnBkQ0J0ZFd4MGFVTnZiRmRsWWtkUVZWTndZWEp6WlUxaGRISnBlQ2hjYmlBZ0lDQWdJQ0FnWkdGMFlTd2dkR2h5WlhOb2IyeGtJQzhnTVRBd0xDQmthWE4wWVc1alpVWnVjeUJoY3lCaGJua3NJR0ZuWjNKbFoyRjBhVzl1VFdWMGFHOWtJR0Z6SUdGdWVTd2dkMlZwWjJoMGN5d2daR2x6ZEdGdVkyVkdia0Z5WjNNcE8xeHVJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNBZ0lHTnZibk52YkdVdVpYSnliM0lvWlNrN1hHNGdJQ0FnZlZ4dUlDQjlYRzRnSUdsbUlDZ2hjM0JoY25ObEtTQjdJQzh2SUdaaGJITmlZV05ySUhSdklFTlFWVnh1SUNBZ0lHbG1JQ2gxYzJWWFpXSkhVRlVwWEc0Z0lDQWdJQ0JqYjI1emIyeGxMbVZ5Y205eUtDZFhSVUpIVUZVZ2MzQmhjbk5sSUcxaGRISnBlQ0JqWVd4amRXeGhkR2x2YmlCbVlXbHNaV1FzSUdaaGJHeHBibWNnWW1GamF5QjBieUJEVUZVZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRuS1R0Y2JseHVJQ0FnSUhOd1lYSnpaU0E5SUdGM1lXbDBJRzVsZHlCVGNHRnljMlZOWVhSeWFYaFRaWEoyYVdObEtDbGNiaUFnSUNBZ0lDNWpZV3hqVFhWc2RHbERiMngxYlc0b1pHRjBZU3dnWkdsemRHRnVZMlZHYm5Nc0lIUm9jbVZ6YUc5c1pDQXZJREV3TUN3Z1pHbHpkR0Z1WTJWR2JrRnlaM01zSUhkbGFXZG9kSE1zSUdGblozSmxaMkYwYVc5dVRXVjBhRzlrS1R0Y2JpQWdmVnh1SUNCamIyNXpiMnhsTG5ScGJXVkZibVFvSjNOd1lYSnpaU0J0WVhSeWFYZ25LVHRjYmx4dUlDQmpiMjV6ZENCeVpYTWdQU0JoZDJGcGRDQnVaWGNnVFVOTVUzQmhjbk5sVW1Wa2RXTmxjaWg3YldGNFNYUmxjbUYwYVc5dWN6b2diV0Y0U1hSbGNtRjBhVzl1Y3lBL1B5QTFmU2t1ZEhKaGJuTm1iM0p0S0hOd1lYSnpaU3dnWkdGMFlWc3dYUzVzWlc1bmRHZ3BPMXh1SUNCd2IzTjBUV1Z6YzJGblpTaDdjbVZ6ZlNrN1hHNTlPMXh1SWwxOSIsImltcG9ydCB7IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIH0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeCkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0U21hbGxlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oYWdncmVnYXRpb25NZXRob2QsIHdlaWdodHMpIHtcbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgICAgIGNhc2UgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuTUFOSEFUVEFOOlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bSA9IHZzLnJlZHVjZSgoYWNjLCB2YWwsIGlkeCkgPT4gYWNjICsgKHZhbCAqIHdlaWdodHNbaWR4XSkgKiogMiwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkWFJwYkhNdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUoxZEdsc2N5NTBjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBMRVZCUVRSQ0xEQkNRVUV3UWl4RlFVRkRMRTFCUVUwc1UwRkJVeXhEUVVGRE8wRkJSVGxGTEUxQlFVMHNRMEZCUXl4TlFVRk5MRXRCUVVzc1IwRkJSeXhEUVVGRExFTkJRVTBzUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4TFFVRkxMRWxCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzVTBGQlV5eERRVUZETzBGQlJTOUVMRTFCUVUwc1ZVRkJWU3hoUVVGaExFTkJRVU1zVjBGQmNVSXNSVUZCUlN4UFFVRnBRaXhGUVVGRkxFZEJRVmNzUlVGQlJTeExRVUZoTzBsQlEyaEhMRWxCUVVrc1IwRkJSeXhIUVVGSExGZEJRVmNzUTBGQlF5eFhRVUZYTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1EwRkJRenRSUVVONlF5eFBRVUZQTzBsQlJWUXNUVUZCVFN4WFFVRlhMRWRCUVVjc1YwRkJWeXhEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6RkVMRmRCUVZjc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU5zUWl4WFFVRlhMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1NVRkRlRU1zVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMGxCUTJRc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRM2hETEVOQlFVTTdRVUZGUkN4TlFVRk5MRlZCUVZVc1dVRkJXU3hEUVVGRExGZEJRWEZDTEVWQlFVVXNUMEZCYVVJc1JVRkJSU3hIUVVGWExFVkJRVVVzUzBGQllUdEpRVU12Uml4SlFVRkpMRWRCUVVjc1IwRkJSeXhYUVVGWExFTkJRVU1zVjBGQlZ5eERRVUZETEUxQlFVMHNSMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRla01zVDBGQlR6dEpRVVZVTEUxQlFVMHNWMEZCVnl4SFFVRkhMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU14UkN4WFFVRlhMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03U1VGRGJFSXNWMEZCVnl4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUTNoRExFOUJRVThzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTmtMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVONFF5eERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMSE5DUVVGelFpeERRVU53UXl4cFFrRkJORU1zUlVGQlJTeFBRVUZwUWp0SlFVVXZSQ3hSUVVGUkxHbENRVUZwUWl4RlFVRkZPMUZCUTNwQ0xFdEJRVXNzTUVKQlFUQkNMRU5CUVVNc1UwRkJVenRaUVVOMlF5eFBRVUZQTEVOQlFVTXNSVUZCV1N4RlFVRkZMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJTeERRVUZETEVkQlFVY3NSMEZCUnl4SFFVRkhMRWRCUVVjc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNKR08xbEJRMFVzVDBGQlR5eERRVUZETEVWQlFWa3NSVUZCUlN4RlFVRkZPMmRDUVVOMFFpeFpRVUZaTzJkQ1FVTmFMRTFCUVUwc1IwRkJSeXhIUVVGSExFVkJRVVVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhIUVVGSExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBVc1QwRkJUeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTNoQ0xFTkJRVU1zUTBGQlF6dExRVU5NTzBGQlEwZ3NRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkN3Z1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkhOOUlHWnliMjBnSnk0dmRIbHdaWE1uTzF4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnYVhOT2FXd2dQU0FvZURvZ1lXNTVLU0E5UGlCNElEMDlQU0J1ZFd4c0lIeDhJSGdnUFQwOUlIVnVaR1ZtYVc1bFpEdGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2x1YzJWeWRGTnRZV3hzWlhJb1pHbHpkR0Z1WTJWelFYSTZJRzUxYldKbGNsdGRMQ0JwYm1SbGVHVnpPaUJ1ZFcxaVpYSmJYU3dnYm5WdE9pQnVkVzFpWlhJc0lHbHVaR1Y0T2lCdWRXMWlaWElwSUh0Y2JpQWdhV1lnS0c1MWJTQStJR1JwYzNSaGJtTmxjMEZ5VzJScGMzUmhibU5sYzBGeUxteGxibWQwYUMweFhTbGNiaUFnSUNCeVpYUjFjbTQ3WEc1Y2JpQWdZMjl1YzNRZ2JtVjNVRzl6YVhScGIyNGdQU0JrYVhOMFlXNWpaWE5CY2k1bWFXNWtTVzVrWlhnb0tIWXBJRDArSUc1MWJTQThJSFlwTzF4dUlDQmthWE4wWVc1alpYTkJjaTV3YjNBb0tUdGNiaUFnWkdsemRHRnVZMlZ6UVhJdWMzQnNhV05sS0c1bGQxQnZjMmwwYVc5dUxDQXdMQ0J1ZFcwcE8xeHVJQ0JwYm1SbGVHVnpMbkJ2Y0NncE8xeHVJQ0JwYm1SbGVHVnpMbk53YkdsalpTaHVaWGRRYjNOcGRHbHZiaXdnTUN3Z2FXNWtaWGdwTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdhVzV6WlhKMFRHRnlaMlZ5S0dScGMzUmhibU5sYzBGeU9pQnVkVzFpWlhKYlhTd2dhVzVrWlhobGN6b2diblZ0WW1WeVcxMHNJRzUxYlRvZ2JuVnRZbVZ5TENCcGJtUmxlRG9nYm5WdFltVnlLU0I3WEc0Z0lHbG1JQ2h1ZFcwZ1BDQmthWE4wWVc1alpYTkJjbHRrYVhOMFlXNWpaWE5CY2k1c1pXNW5kR2d0TVYwcFhHNGdJQ0FnY21WMGRYSnVPMXh1WEc0Z0lHTnZibk4wSUc1bGQxQnZjMmwwYVc5dUlEMGdaR2x6ZEdGdVkyVnpRWEl1Wm1sdVpFbHVaR1Y0S0NoMktTQTlQaUJ1ZFcwZ1BpQjJLVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjRzl3S0NrN1hHNGdJR1JwYzNSaGJtTmxjMEZ5TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2diblZ0S1R0Y2JpQWdhVzVrWlhobGN5NXdiM0FvS1R0Y2JpQWdhVzVrWlhobGN5NXpjR3hwWTJVb2JtVjNVRzl6YVhScGIyNHNJREFzSUdsdVpHVjRLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZuWjNKbFoyRjBhVzl1Um5WdVkzUnBiMjRvWEc0Z0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a09pQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a0xDQjNaV2xuYUhSek9pQnVkVzFpWlhKYlhWeHVLVG9nS0haaGJIVmxjem9nYm5WdFltVnlXMTBwSUQwK0lHNTFiV0psY2lCN1hHNGdJSE4zYVhSamFDQW9ZV2RuY21WbllYUnBiMjVOWlhSb2IyUXBJSHRjYmlBZ0lDQmpZWE5sSUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6TGsxQlRraEJWRlJCVGpwY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG5NNklHNTFiV0psY2x0ZEtTQTlQaUIyY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzTENCcFpIZ3BJRDArSUdGall5QXJJSFpoYkNBcUlIZGxhV2RvZEhOYmFXUjRYU3dnTUNrN1hHNGdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJSEpsZEhWeWJpQW9kbk02SUc1MWJXSmxjbHRkS1NBOVBpQjdYRzRnSUNBZ0lDQWdJQzh2SUdWMVkyeHBaR1ZoYmx4dUlDQWdJQ0FnSUNCamIyNXpkQ0J6ZFcwZ1BTQjJjeTV5WldSMVkyVW9LR0ZqWXl3Z2RtRnNMQ0JwWkhncElEMCtJR0ZqWXlBcklDaDJZV3dnS2lCM1pXbG5hSFJ6VzJsa2VGMHBJQ29xSURJc0lEQXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdUV0YwYUM1emNYSjBLSE4xYlNrN1hHNGdJQ0FnSUNCOU8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4vLyB0aGUgc3RhcnR1cCBmdW5jdGlvblxuX193ZWJwYWNrX3JlcXVpcmVfXy54ID0gKCkgPT4ge1xuXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcblx0Ly8gVGhpcyBlbnRyeSBtb2R1bGUgZGVwZW5kcyBvbiBvdGhlciBsb2FkZWQgY2h1bmtzIGFuZCBleGVjdXRpb24gbmVlZCB0byBiZSBkZWxheWVkXG5cdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgWzU5MF0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKDg5NjApKSlcblx0X193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcblx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG59O1xuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzIGFuZCBzaWJsaW5nIGNodW5rcyBmb3IgdGhlIGVudHJ5cG9pbnRcbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5qc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgc2NyaXB0VXJsO1xuaWYgKF9fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzKSBzY3JpcHRVcmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24gKyBcIlwiO1xudmFyIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O1xuaWYgKCFzY3JpcHRVcmwgJiYgZG9jdW1lbnQpIHtcblx0aWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpXG5cdFx0c2NyaXB0VXJsID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7XG5cdGlmICghc2NyaXB0VXJsKSB7XG5cdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblx0XHRpZihzY3JpcHRzLmxlbmd0aCkge1xuXHRcdFx0dmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7XG5cdFx0XHR3aGlsZSAoaSA+IC0xICYmICFzY3JpcHRVcmwpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBzZWxmLmxvY2F0aW9uICsgXCJcIjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwiYWxyZWFkeSBsb2FkZWRcIlxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0MjQ2OiAxXG59O1xuXG4vLyBpbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmdcbnZhciBpbnN0YWxsQ2h1bmsgPSAoZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdHdoaWxlKGNodW5rSWRzLmxlbmd0aClcblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHMucG9wKCldID0gMTtcblx0cGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24oZGF0YSk7XG59O1xuX193ZWJwYWNrX3JlcXVpcmVfXy5mLmkgPSAoY2h1bmtJZCwgcHJvbWlzZXMpID0+IHtcblx0Ly8gXCIxXCIgaXMgdGhlIHNpZ25hbCBmb3IgXCJhbHJlYWR5IGxvYWRlZFwiXG5cdGlmKCFpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRpZih0cnVlKSB7IC8vIGFsbCBjaHVua3MgaGF2ZSBKU1xuXHRcdFx0aW1wb3J0U2NyaXB0cyhfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCkpO1xuXHRcdH1cblx0fVxufTtcblxudmFyIGNodW5rTG9hZGluZ0dsb2JhbCA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtlZGFcIl0gPSBzZWxmW1wid2VicGFja0NodW5rZWRhXCJdIHx8IFtdO1xudmFyIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uID0gY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSBpbnN0YWxsQ2h1bms7XG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCIvLyBydW4gc3RhcnR1cFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLngoKTtcbiJdLCJuYW1lcyI6WyJkZWZlcnJlZCIsIm5leHQiLCJXRUJHU0xBR0dSRUdBVElPTiIsIldFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TIiwiRVVDTElERUFOIiwiYXJyYXlTaXplIiwiTUFOSEFUVEFOIiwiV0VCR1BVRElTVEFOQ0UiLCJ3ZWJHUFVGdW5jdGlvbnMiLCJIQU1NSU5HIiwiX21heEFycmF5U2l6ZSIsImVudHJ5SW5kZXgiLCJtYXhBcnJheVNpemUiLCJfZW50cnlJbmRleCIsIlRBTklNT1RPIiwiTEVWRU5TVEVJTiIsIk5FRURMRU1BTl9XVU5TQ0giLCJNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFIiwiU09LQUwiLCJDT1NJTkUiLCJBU1lNTUVUUklDIiwiRGlmZmVyZW5jZSIsIk9uZUhvdCIsImRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5IiwibWF4RW50cnlTaXplIiwiTWF0aCIsImNlaWwiLCJfbWF4RW50cnlTaXplIiwiVHlwZVN1cHBvcnRlZERpc3RhbmNlcyIsIlNldCIsImdwdUFkYXB0ZXIiLCJncHVEZXZpY2UiLCJtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeCIsImVudHJ5TGlzdCIsInRocmVzaG9sZCIsImRpc3RhbmNlTWV0cmljcyIsImFnZ3JlZ2F0aW9uRnVuY3Rpb24iLCJ3ZWlnaHRzIiwib3B0aW9ucyIsInRoaXNBcmciLCJ0aGlzIiwiX2FyZ3VtZW50cyIsImdlbmVyYXRvciIsImRldmljZSIsIm5hdmlnYXRvciIsImdwdSIsInJlcXVlc3RBZGFwdGVyIiwicG93ZXJQcmVmZXJlbmNlIiwiaXNMb3N0IiwibG9zdCIsInRoZW4iLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJyZXF1aXJlZEJ1ZmZlclNpemUiLCJhZGFwdGVyTGltaXRzIiwibGltaXRzIiwiYnVmZmZlclNpemVMaW1pdCIsIm1heEJ1ZmZlclNpemUiLCJzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0IiwibWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplIiwicmVxdWVzdERldmljZSIsInJlcXVpcmVkTGltaXRzIiwibWluIiwiZSIsImNvbnNvbGUiLCJlcnJvciIsIlAiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwiYXBwbHkiLCJnZXRHUFVEZXZpY2UiLCJhdmFpbGFibGVEaXN0YW5jZU1ldHJpY3MiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwibWV0cmljIiwiaW5jbHVkZXMiLCJFcnJvciIsImpvaW4iLCJtYXhEaXN0YW5jZSIsImxlbmd0aCIsImxpc3QiLCJudW1PZkNvbHVtbnMiLCJsaXN0U2l6ZSIsInByb2Nlc3NJbmZvIiwibWFwIiwiZW50cnkiLCJpIiwiZGlzdGFuY2VNZXRyaWMiLCJnYXBPcGVuUGVuYWx0eSIsImdhcEV4dGVuc2lvblBlbmFsdHkiLCJfYSIsIl9iIiwiZW50cnlUeXBlIiwiZW5jb2RlZExpc3QiLCJVaW50MzJBcnJheSIsInNwbGl0IiwiYyIsImNoYXJDb2RlQXQiLCJGbG9hdDMyQXJyYXkiLCJfZGF0YSIsIkludDMyQXJyYXkiLCJlbmNvZGVkTGlzdFR5cGUiLCJhcnJheVNpemVzIiwiYXJyIiwiaGFzIiwibWF4RW50cnlMZW4iLCJyZWR1Y2UiLCJhIiwiYiIsIm1heCIsImNvbXBsZXhpdHkiLCJFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvciIsImZsYXRTb3VyY2VBcnJheSIsImZvckVhY2giLCJzZXEiLCJzZXQiLCJzdXBwSW5mb1N0cnVjdFdnc2wiLCJzdXBwSW5mb1NpemUiLCJzdXBwSW5mb1R5cGUiLCJzdXBwSW5mb0J1ZmZlciIsIm1heE1vbm9tZXJJbmRleCIsInNjb3JpbmdNYXRyaXgiLCJhbHBoYWJldEluZGV4ZXMiLCJrZXlzIiwicHJldiIsIm4iLCJBcnJheSIsImZpbGwiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJzaW1pbGFyaXR5TWF0cml4U2l6ZSIsInRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4Iiwia2V5Iiwia2V5MiIsIm9mZnNldCIsInJhbmdlIiwiZGF0YVR5cGVXR1NMIiwiZGF0YVN0cnVjdFdnc2wiLCJzb3VyY2VBcnJheVNpemUiLCJ3ZWJHUFVQcm9jZXNzSW5mbyIsInN1cHBJbmZvV2dzbCIsImluZm8iLCJmaWx0ZXIiLCJ3Z3NsIiwibmVlZHNEdW1teSIsInRyaW0iLCJkYXRhV2dzbCIsIm51bU9mVGhyZWFkcyIsInNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQiLCJjb21iaW5lZENvbXBsZXhpdHkiLCJtYXhJdGVyYXRpb25zUGVyVGhyZWFkIiwid29ya2dyb3Vwc0RpbSIsInNxcnQiLCJnbG9iYWxUaHJlYWREaW1TaXplIiwiY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIiwiZG1DaHVua1NpemVQZXJUaHJlYWQiLCJtb2R1bGUiLCJjcmVhdGVTaGFkZXJNb2R1bGUiLCJsYWJlbCIsImNvZGUiLCJnZXRDb21iaW5lZERpc3RhbmNlU2NyaXB0IiwicGlwZWxpbmUiLCJjcmVhdGVDb21wdXRlUGlwZWxpbmUiLCJsYXlvdXQiLCJjb21wdXRlIiwiZW50cnlQb2ludCIsInN0YXJ0QXRDb2xzIiwic3RhcnRBdFJvd3MiLCJlbmRBdENvbHMiLCJlbmRBdFJvd3MiLCJjaHVua1NpemUiLCJmbG9vciIsInN0YXJ0Um93Iiwic3RhcnRDb2wiLCJ0aW1lIiwiZW5kSWR4IiwiZW5kUm93IiwiZW5kQ29sIiwidGltZUVuZCIsImNvbXB1dGVJbmZvQnVmZmVyMzJTaXplIiwic3VwcEluZm9CdWZmZXIzMlNpemUiLCJzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUiLCJjb21wdXRlSW5mb0J1ZmZlclNpemUiLCJCWVRFU19QRVJfRUxFTUVOVCIsInBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSIsInJlbWFpbmRlciIsImNvbXB1dGVJbmZvQnVmZmVyIiwiY3JlYXRlQnVmZmVyIiwic2l6ZSIsInVzYWdlIiwiR1BVQnVmZmVyVXNhZ2UiLCJTVE9SQUdFIiwiQ09QWV9TUkMiLCJDT1BZX0RTVCIsIm1hcHBlZEF0Q3JlYXRpb24iLCJtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyIiwiZ2V0TWFwcGVkUmFuZ2UiLCJjb21wdXRlSW5mb09mZlNldCIsIkFycmF5Q29uc3RydWN0b3IiLCJ1bm1hcCIsInN1cHBJbmZvQnVmZmVyU2l6ZSIsInBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSIsInN1cHBJbmZvUmVtYWluZGVyIiwibWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciIsInN1cHBJbmZvT2ZmU2V0IiwiYnl0ZUxlbmd0aCIsInJlc3VsdHNCdWZmZXJTaXplIiwicGFkZGVkUmVzdWx0c0J1ZmZlclNpemUiLCJyZXN1bHRzUmVtYWluZGVyIiwicmVzdWx0c0J1ZmZlciIsImJpbmRHcm91cCIsImNyZWF0ZUJpbmRHcm91cCIsImdldEJpbmRHcm91cExheW91dCIsImVudHJpZXMiLCJiaW5kaW5nIiwicmVzb3VyY2UiLCJidWZmZXIiLCJyZXN1bHRzT3V0QnVmZmVyIiwiTUFQX1JFQUQiLCJyZXN1bHRJcyIsInJlc3VsdEpzIiwicmVzdWx0RGlzdGFuY2VzIiwiaXNBbGxEb25lIiwiZW5jb2RlciIsImNyZWF0ZUNvbW1hbmRFbmNvZGVyIiwicGFzcyIsImJlZ2luQ29tcHV0ZVBhc3MiLCJzZXRQaXBlbGluZSIsInNldEJpbmRHcm91cCIsImRpc3BhdGNoV29ya2dyb3VwcyIsImVuZCIsImNvcHlCdWZmZXJUb0J1ZmZlciIsImNvbW1hbmRCdWZmZXIiLCJmaW5pc2giLCJxdWV1ZSIsInN1Ym1pdCIsIm9uU3VibWl0dGVkV29ya0RvbmUiLCJtYXBBc3luYyIsIkdQVU1hcE1vZGUiLCJSRUFEIiwicmVzdWx0c091dEFycmF5QnVmZmVyIiwicmVzdWx0T2Zmc2V0IiwicmVzdWx0c0kiLCJyZXN1bHRzSiIsInJlc3VsdHNEaXN0YW5jZXMiLCJyZXN1bHRzRm91bmQiLCJldmVyeSIsImQiLCJ0b3RhbFJlc3VsdHMiLCJjb21iaW5lZEkiLCJjb21iaW5lZEoiLCJjb21iaW5lZERpc3RhbmNlcyIsImNvbWJpbmVkT2Zmc2V0IiwicmVzSSIsImZvdW5kIiwic3ViYXJyYXkiLCJwdXNoIiwidG90YWxTaXplIiwiZmluYWxJIiwiZmluYWxKIiwiZmluYWxEaXN0YW5jZXMiLCJmaW5hbE9mZnNldCIsImRlc3Ryb3kiLCJqIiwiZGlzdGFuY2UiLCJtYXhFbnRyeUxlbnMiLCJhZ2dyZWdhdGlvbiIsIl8iLCJhc3luYyIsImJpb0xheW91dCIsImNsdXN0ZXIiLCJzcGFyc2VPYmplY3QiLCJpcyIsImpzIiwiZW1iZWRYIiwicmFuZG9tIiwiZW1iZWRZIiwieFZlbG9jaXRpZXMiLCJ5VmVsb2NpdGllcyIsInRlbXBlcmF0dXJlIiwiaWR4IiwiZHgiLCJkeSIsImFicyIsInZlY1NpemUiLCJtaW5YIiwibWluWSIsIm1heFgiLCJtYXhZIiwicmFuZ2VYIiwicmFuZ2VZIiwiZ2V0TGF5b3V0RW1iZWRkaW5ncyIsImRlZmF1bHRNQ0xPcHRpb25zIiwiZXhwYW5kRmFjdG9yIiwibWF4SXRlcmF0aW9ucyIsImluZmxhdGVGYWN0b3IiLCJtdWx0RmFjdG9yIiwiTUNMU3BhcnNlUmVkdWNlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsIl9vcHRpb25zIiwic3BhcnNlTWF0cml4IiwiblJvd3MiLCJ0b09iamVjdEZvcm0iLCJhZGRMb29wcyIsIm5vcm1hbGl6ZSIsImV4cGFuZCIsImluZmxhdGUiLCJjbHVzdGVycyIsImFzc2lnbkNsdXN0ZXJzIiwiY29ycmVjdENsdXN0ZXJzIiwiZW1iZWRkaW5ncyIsImNsdXN0ZXJTaXplTWFwIiwic29ydGVkSW5kZXhlcyIsIk51bWJlciIsInNvcnQiLCJjbHVzdGVyTWFwIiwiY2x1c3RlcklkeCIsImNsdXN0ZXJOdW0iLCJzb3J0ZWRDbHVzdGVyTmFtZXMiLCJwZXJSb3ciLCJ5T2Zmc2V0IiwiY2x1c3Rlck5hbWUiLCJvZmZzZXRYIiwibWVyZ2VDbHVzdGVycyIsImlDbHVzdGVyIiwiakNsdXN0ZXIiLCJrIiwib3JkZXIiLCJsb2cxMCIsIm1pbk9yZGVyIiwicG93Iiwicm91bmQiLCJyb3ciLCJzdW0iLCJleHBhbmRlZE9iamVjdCIsInZhbCIsImdldEV4cGFuZFZhbHVlIiwiY3VycmVudEluZGV4ZXMiLCJvdGhlckluZGV4ZXMiLCJvbm1lc3NhZ2UiLCJldmVudCIsImRhdGEiLCJhZ2dyZWdhdGlvbk1ldGhvZCIsImRpc3RhbmNlRm5BcmdzIiwiZGlzdGFuY2VGbnMiLCJ1c2VXZWJHUFUiLCJzcGFyc2UiLCJjYWxjTXVsdGlDb2x1bW4iLCJyZXMiLCJ0cmFuc2Zvcm0iLCJwb3N0TWVzc2FnZSIsImlzTmlsIiwieCIsImluc2VydFNtYWxsZXIiLCJkaXN0YW5jZXNBciIsImluZGV4ZXMiLCJudW0iLCJpbmRleCIsIm5ld1Bvc2l0aW9uIiwiZmluZEluZGV4IiwidiIsInBvcCIsInNwbGljZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsInVuZGVmaW5lZCIsImV4cG9ydHMiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibSIsIl9fd2VicGFja19leHBvcnRzX18iLCJPIiwiY2h1bmtJZHMiLCJmbiIsInByaW9yaXR5Iiwibm90RnVsZmlsbGVkIiwiSW5maW5pdHkiLCJkZWZpbml0aW9uIiwibyIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsImYiLCJjaHVua0lkIiwiYWxsIiwicHJvbWlzZXMiLCJ1IiwiZyIsImdsb2JhbFRoaXMiLCJGdW5jdGlvbiIsIndpbmRvdyIsIm9iaiIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzY3JpcHRVcmwiLCJpbXBvcnRTY3JpcHRzIiwibG9jYXRpb24iLCJkb2N1bWVudCIsImN1cnJlbnRTY3JpcHQiLCJzcmMiLCJzY3JpcHRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJyZXBsYWNlIiwicCIsInNlbGYiLCJpbnN0YWxsZWRDaHVua3MiLCJjaHVua0xvYWRpbmdHbG9iYWwiLCJwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiIsImJpbmQiLCJtb3JlTW9kdWxlcyIsInJ1bnRpbWUiXSwic291cmNlUm9vdCI6IiJ9