UNPKG

sql.js

Version:

SQLite library with support for opening and writing databases, prepared statements, and more. This SQLite library is in pure javascript (compiled with emscripten).

98 lines (86 loc) 1.36 MB
// We are modularizing this manually because the current modularize setting in Emscripten has some issues: // https://github.com/kripken/emscripten/issues/5820 // In addition, When you use emcc's modularization, it still expects to export a global object called `Module`, // which is able to be used/called before the WASM is loaded. // The modularization below exports a promise that loads and resolves to the actual sql.js module. // That way, this module can't be used before the WASM is finished loading. // We are going to define a function that a user will call to start loading initializing our Sql.js library // However, that function might be called multiple times, and on subsequent calls, we don't actually want it to instantiate a new instance of the Module // Instead, we want to return the previously loaded module // TODO: Make this not declare a global if used in the browser var initSqlJsPromise = undefined; var initSqlJs = function (moduleConfig) { if (initSqlJsPromise){ return initSqlJsPromise; } // If we're here, we've never called this function before initSqlJsPromise = new Promise(function (resolveModule, reject) { // We are modularizing this manually because the current modularize setting in Emscripten has some issues: // https://github.com/kripken/emscripten/issues/5820 // The way to affect the loading of emcc compiled modules is to create a variable called `Module` and add // properties to it, like `preRun`, `postRun`, etc // We are using that to get notified when the WASM has finished loading. // Only then will we return our promise // If they passed in a moduleConfig object, use that // Otherwise, initialize Module to the empty object var Module = typeof moduleConfig !== 'undefined' ? moduleConfig : {}; // EMCC only allows for a single onAbort function (not an array of functions) // So if the user defined their own onAbort function, we remember it and call it var originalOnAbortFunction = Module['onAbort']; Module['onAbort'] = function (errorThatCausedAbort) { reject(new Error(errorThatCausedAbort)); if (originalOnAbortFunction){ originalOnAbortFunction(errorThatCausedAbort); } }; Module['postRun'] = Module['postRun'] || []; Module['postRun'].push(function () { // When Emscripted calls postRun, this promise resolves with the built Module resolveModule(Module); }); // There is a section of code in the emcc-generated code below that looks like this: // (Note that this is lowercase `module`) // if (typeof module !== 'undefined') { // module['exports'] = Module; // } // When that runs, it's going to overwrite our own modularization export efforts in shell-post.js! // The only way to tell emcc not to emit it is to pass the MODULARIZE=1 or MODULARIZE_INSTANCE=1 flags, // but that carries with it additional unnecessary baggage/bugs we don't want either. // So, we have three options: // 1) We undefine `module` // 2) We remember what `module['exports']` was at the beginning of this function and we restore it later // 3) We write a script to remove those lines of code as part of the Make process. // // Since those are the only lines of code that care about module, we will undefine it. It's the most straightforward // of the options, and has the side effect of reducing emcc's efforts to modify the module if its output were to change in the future. // That's a nice side effect since we're handling the modularization efforts ourselves module = undefined; // The emcc-generated code and shell-post.js code goes below, // meaning that all of it runs inside of this promise. If anything throws an exception, our promise will abort var k;k||=typeof Module != 'undefined' ? Module : {};var aa=!!globalThis.window,ba=!!globalThis.WorkerGlobalScope,ca=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type; k.onRuntimeInitialized=function(){function a(f,l){switch(typeof l){case "boolean":Xb(f,l?1:0);break;case "number":Yb(f,l);break;case "string":Zb(f,l,-1,-1);break;case "object":if(null===l)hb(f);else if(null!=l.length){var n=da(l.length);m.set(l,n);$b(f,n,l.length,-1);ea(n)}else ta(f,"Wrong API use : tried to return a value of an unknown type ("+l+").",-1);break;default:hb(f)}}function b(f,l){for(var n=[],p=0;p<f;p+=1){var w=q(l+4*p,"i32"),y=ac(w);if(1===y||2===y)w=bc(w);else if(3===y)w=cc(w);else if(4=== y){y=w;w=dc(y);y=ec(y);for(var M=new Uint8Array(w),K=0;K<w;K+=1)M[K]=m[y+K];w=M}else w=null;n.push(w)}return n}function c(f,l){this.Qa=f;this.db=l;this.Oa=1;this.ob=[]}function d(f,l){this.db=l;this.fb=fa(f);if(null===this.fb)throw Error("Unable to allocate memory for the SQL string");this.kb=this.fb;this.$a=this.ub=null}function e(f){this.filename="dbfile_"+(4294967295*Math.random()>>>0);if(null!=f){var l=this.filename,n="/",p=l;n&&(n="string"==typeof n?n:ha(n),p=l?ia(n+"/"+l):n);l=ja(!0,!0);p=ka(p, l);if(f){if("string"==typeof f){n=Array(f.length);for(var w=0,y=f.length;w<y;++w)n[w]=f.charCodeAt(w);f=n}la(p,l|146);n=ma(p,577);na(n,f,0,f.length,0);oa(n);la(p,l)}}this.handleError(u(this.filename,g));this.db=q(g,"i32");kb(this.db);this.gb={};this.Sa={}}var g=t(4),h=k.cwrap,u=h("sqlite3_open","number",["string","number"]),x=h("sqlite3_close_v2","number",["number"]),r=h("sqlite3_exec","number",["number","string","number","number","number"]),C=h("sqlite3_changes","number",["number"]),D=h("sqlite3_prepare_v2", "number",["number","string","number","number","number"]),lb=h("sqlite3_sql","string",["number"]),gc=h("sqlite3_normalized_sql","string",["number"]),mb=h("sqlite3_prepare_v2","number",["number","number","number","number","number"]),hc=h("sqlite3_bind_text","number",["number","number","number","number","number"]),nb=h("sqlite3_bind_blob","number",["number","number","number","number","number"]),ic=h("sqlite3_bind_double","number",["number","number","number"]),jc=h("sqlite3_bind_int","number",["number", "number","number"]),kc=h("sqlite3_bind_parameter_index","number",["number","string"]),lc=h("sqlite3_step","number",["number"]),mc=h("sqlite3_errmsg","string",["number"]),nc=h("sqlite3_column_count","number",["number"]),oc=h("sqlite3_data_count","number",["number"]),pc=h("sqlite3_column_double","number",["number","number"]),ob=h("sqlite3_column_text","string",["number","number"]),qc=h("sqlite3_column_blob","number",["number","number"]),rc=h("sqlite3_column_bytes","number",["number","number"]),sc=h("sqlite3_column_type", "number",["number","number"]),tc=h("sqlite3_column_name","string",["number","number"]),uc=h("sqlite3_reset","number",["number"]),vc=h("sqlite3_clear_bindings","number",["number"]),wc=h("sqlite3_finalize","number",["number"]),pb=h("sqlite3_create_function_v2","number","number string number number number number number number number".split(" ")),ac=h("sqlite3_value_type","number",["number"]),dc=h("sqlite3_value_bytes","number",["number"]),cc=h("sqlite3_value_text","string",["number"]),ec=h("sqlite3_value_blob", "number",["number"]),bc=h("sqlite3_value_double","number",["number"]),Yb=h("sqlite3_result_double","",["number","number"]),hb=h("sqlite3_result_null","",["number"]),Zb=h("sqlite3_result_text","",["number","string","number","number"]),$b=h("sqlite3_result_blob","",["number","number","number","number"]),Xb=h("sqlite3_result_int","",["number","number"]),ta=h("sqlite3_result_error","",["number","string","number"]),qb=h("sqlite3_aggregate_context","number",["number","number"]),kb=h("RegisterExtensionFunctions", "number",["number"]),rb=h("sqlite3_update_hook","number",["number","number","number"]);c.prototype.bind=function(f){if(!this.Qa)throw"Statement closed";this.reset();return Array.isArray(f)?this.Ib(f):null!=f&&"object"===typeof f?this.Jb(f):!0};c.prototype.step=function(){if(!this.Qa)throw"Statement closed";this.Oa=1;var f=lc(this.Qa);switch(f){case 100:return!0;case 101:return!1;default:throw this.db.handleError(f);}};c.prototype.Cb=function(f){null==f&&(f=this.Oa,this.Oa+=1);return pc(this.Qa,f)}; c.prototype.Qb=function(f){null==f&&(f=this.Oa,this.Oa+=1);f=ob(this.Qa,f);if("function"!==typeof BigInt)throw Error("BigInt is not supported");return BigInt(f)};c.prototype.Vb=function(f){null==f&&(f=this.Oa,this.Oa+=1);return ob(this.Qa,f)};c.prototype.getBlob=function(f){null==f&&(f=this.Oa,this.Oa+=1);var l=rc(this.Qa,f);f=qc(this.Qa,f);for(var n=new Uint8Array(l),p=0;p<l;p+=1)n[p]=m[f+p];return n};c.prototype.get=function(f,l){l=l||{};null!=f&&this.bind(f)&&this.step();f=[];for(var n=oc(this.Qa), p=0;p<n;p+=1)switch(sc(this.Qa,p)){case 1:var w=l.useBigInt?this.Qb(p):this.Cb(p);f.push(w);break;case 2:f.push(this.Cb(p));break;case 3:f.push(this.Vb(p));break;case 4:f.push(this.getBlob(p));break;default:f.push(null)}return f};c.prototype.sb=function(){for(var f=[],l=nc(this.Qa),n=0;n<l;n+=1)f.push(tc(this.Qa,n));return f};c.prototype.Bb=function(f,l){f=this.get(f,l);l=this.sb();for(var n={},p=0;p<l.length;p+=1)n[l[p]]=f[p];return n};c.prototype.Ub=function(){return lb(this.Qa)};c.prototype.Rb= function(){return gc(this.Qa)};c.prototype.run=function(f){null!=f&&this.bind(f);this.step();return this.reset()};c.prototype.yb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);f=fa(f);this.ob.push(f);this.db.handleError(hc(this.Qa,l,f,-1,0))};c.prototype.Hb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);var n=da(f.length);m.set(f,n);this.ob.push(n);this.db.handleError(nb(this.Qa,l,n,f.length,0))};c.prototype.xb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);this.db.handleError((f===(f|0)?jc:ic)(this.Qa, l,f))};c.prototype.Kb=function(f){null==f&&(f=this.Oa,this.Oa+=1);nb(this.Qa,f,0,0,0)};c.prototype.zb=function(f,l){null==l&&(l=this.Oa,this.Oa+=1);switch(typeof f){case "string":this.yb(f,l);return;case "number":this.xb(f+0,l);return;case "bigint":this.yb(f.toString(),l);return;case "boolean":this.xb(f+0,l);return;case "object":if(null===f){this.Kb(l);return}if(null!=f.length){this.Hb(f,l);return}}throw"Wrong API use : tried to bind a value of an unknown type ("+f+").";};c.prototype.Jb=function(f){var l= this;Object.keys(f).forEach(function(n){var p=kc(l.Qa,n);0!==p&&l.zb(f[n],p)});return!0};c.prototype.Ib=function(f){for(var l=0;l<f.length;l+=1)this.zb(f[l],l+1);return!0};c.prototype.reset=function(){this.freemem();return 0===vc(this.Qa)&&0===uc(this.Qa)};c.prototype.freemem=function(){for(var f;void 0!==(f=this.ob.pop());)ea(f)};c.prototype.Ya=function(){this.freemem();var f=0===wc(this.Qa);delete this.db.gb[this.Qa];this.Qa=0;return f};d.prototype.next=function(){if(null===this.fb)return{done:!0}; null!==this.$a&&(this.$a.Ya(),this.$a=null);if(!this.db.db)throw this.qb(),Error("Database closed");var f=pa(),l=t(4);qa(g);qa(l);try{this.db.handleError(mb(this.db.db,this.kb,-1,g,l));this.kb=q(l,"i32");var n=q(g,"i32");if(0===n)return this.qb(),{done:!0};this.$a=new c(n,this.db);this.db.gb[n]=this.$a;return{value:this.$a,done:!1}}catch(p){throw this.ub=v(this.kb),this.qb(),p;}finally{ra(f)}};d.prototype.qb=function(){ea(this.fb);this.fb=null};d.prototype.Sb=function(){return null!==this.ub?this.ub: v(this.kb)};"function"===typeof Symbol&&"symbol"===typeof Symbol.iterator&&(d.prototype[Symbol.iterator]=function(){return this});e.prototype.run=function(f,l){if(!this.db)throw"Database closed";if(l){f=this.vb(f,l);try{f.step()}finally{f.Ya()}}else this.handleError(r(this.db,f,0,0,g));return this};e.prototype.exec=function(f,l,n){if(!this.db)throw"Database closed";var p=null,w=null,y=null;try{y=w=fa(f);var M=t(4);for(f=[];0!==q(y,"i8");){qa(g);qa(M);this.handleError(mb(this.db,y,-1,g,M));var K=q(g, "i32");y=q(M,"i32");if(0!==K){var J=null;p=new c(K,this);for(null!=l&&p.bind(l);p.step();)null===J&&(J={columns:p.sb(),values:[]},f.push(J)),J.values.push(p.get(null,n));p.Ya()}}return f}catch(N){throw p&&p.Ya(),N;}finally{w&&ea(w)}};e.prototype.Ob=function(f,l,n,p,w){"function"===typeof l&&(p=n,n=l,l=void 0);f=this.vb(f,l);try{for(;f.step();)n(f.Bb(null,w))}finally{f.Ya()}if("function"===typeof p)return p()};e.prototype.vb=function(f,l){qa(g);this.handleError(D(this.db,f,-1,g,0));f=q(g,"i32");if(0=== f)throw"Nothing to prepare";var n=new c(f,this);null!=l&&n.bind(l);return this.gb[f]=n};e.prototype.Wb=function(f){return new d(f,this)};e.prototype.Pb=function(){Object.values(this.gb).forEach(function(l){l.Ya()});Object.values(this.Sa).forEach(z);this.Sa={};this.handleError(x(this.db));var f=sa(this.filename);this.handleError(u(this.filename,g));this.db=q(g,"i32");kb(this.db);return f};e.prototype.close=function(){null!==this.db&&(Object.values(this.gb).forEach(function(f){f.Ya()}),Object.values(this.Sa).forEach(z), this.Sa={},this.Za&&(z(this.Za),this.Za=void 0),this.handleError(x(this.db)),ua("/"+this.filename),this.db=null)};e.prototype.handleError=function(f){if(0===f)return null;f=mc(this.db);throw Error(f);};e.prototype.Tb=function(){return C(this.db)};e.prototype.Mb=function(f,l){Object.prototype.hasOwnProperty.call(this.Sa,f)&&(z(this.Sa[f]),delete this.Sa[f]);var n=va(function(p,w,y){w=b(w,y);try{var M=l.apply(null,w)}catch(K){ta(p,K,-1);return}a(p,M)},"viii");this.Sa[f]=n;this.handleError(pb(this.db, f,l.length,1,0,n,0,0,0));return this};e.prototype.Lb=function(f,l){var n=l.init||function(){return null},p=l.finalize||function(J){return J},w=l.step;if(!w)throw"An aggregate function must have a step function in "+f;var y={};Object.hasOwnProperty.call(this.Sa,f)&&(z(this.Sa[f]),delete this.Sa[f]);l=f+"__finalize";Object.hasOwnProperty.call(this.Sa,l)&&(z(this.Sa[l]),delete this.Sa[l]);var M=va(function(J,N,La){var W=qb(J,1);Object.hasOwnProperty.call(y,W)||(y[W]=n());N=b(N,La);N=[y[W]].concat(N); try{y[W]=w.apply(null,N)}catch(yc){delete y[W],ta(J,yc,-1)}},"viii"),K=va(function(J){var N=qb(J,1);try{var La=p(y[N])}catch(W){delete y[N];ta(J,W,-1);return}a(J,La);delete y[N]},"vi");this.Sa[f]=M;this.Sa[l]=K;this.handleError(pb(this.db,f,w.length-1,1,0,0,M,K,0));return this};e.prototype.ac=function(f){this.Za&&(rb(this.db,0,0),z(this.Za),this.Za=void 0);if(!f)return this;this.Za=va(function(l,n,p,w,y){switch(n){case 18:l="insert";break;case 23:l="update";break;case 9:l="delete";break;default:throw"unknown operationCode in updateHook callback: "+ n;}p=v(p);w=v(w);if(y>Number.MAX_SAFE_INTEGER)throw"rowId too big to fit inside a Number";f(l,p,w,Number(y))},"viiiij");rb(this.db,this.Za,0);return this};c.prototype.bind=c.prototype.bind;c.prototype.step=c.prototype.step;c.prototype.get=c.prototype.get;c.prototype.getColumnNames=c.prototype.sb;c.prototype.getAsObject=c.prototype.Bb;c.prototype.getSQL=c.prototype.Ub;c.prototype.getNormalizedSQL=c.prototype.Rb;c.prototype.run=c.prototype.run;c.prototype.reset=c.prototype.reset;c.prototype.freemem= c.prototype.freemem;c.prototype.free=c.prototype.Ya;d.prototype.next=d.prototype.next;d.prototype.getRemainingSQL=d.prototype.Sb;e.prototype.run=e.prototype.run;e.prototype.exec=e.prototype.exec;e.prototype.each=e.prototype.Ob;e.prototype.prepare=e.prototype.vb;e.prototype.iterateStatements=e.prototype.Wb;e.prototype["export"]=e.prototype.Pb;e.prototype.close=e.prototype.close;e.prototype.handleError=e.prototype.handleError;e.prototype.getRowsModified=e.prototype.Tb;e.prototype.create_function=e.prototype.Mb; e.prototype.create_aggregate=e.prototype.Lb;e.prototype.updateHook=e.prototype.ac;k.Database=e};var wa="./this.program",xa=(a,b)=>{throw b;},ya=globalThis.document?.currentScript?.src;"undefined"!=typeof __filename?ya=__filename:ba&&(ya=self.location.href);if(ca){var fs=require("node:fs");1<process.argv.length&&(wa=process.argv[1].replace(/\\/g,"/"));process.argv.slice(2);"undefined"!=typeof module&&(module.exports=k);xa=(a,b)=>{process.exitCode=a;throw b;}}else if(aa||ba)try{new URL(".",ya)}catch{} var za=console.log.bind(console),A=console.error.bind(console),Aa;function Ba(a){this.exports=( // EMSCRIPTEN_START_ASM function instantiate(Ua){function e(f){f.grow=function(b){var a=this.length;this.length=this.length+b;return a};f.set=function(c,d){this[c]=d};f.get=function(c){return this[c]};return f}var g;var h=new Uint8Array(123);for(var c=25;c>=0;--c){h[48+c]=52+c;h[65+c]=c;h[97+c]=26+c}h[43]=62;h[47]=63;function n(o,p,q){var i,j,c=0,k=p,l=q.length,m=p+(l*3>>2)-(q[l-2]=="=")-(q[l-1]=="=");for(;c<l;c+=4){i=h[q.charCodeAt(c+1)];j=h[q.charCodeAt(c+2)];o[k++]=h[q.charCodeAt(c)]<<2|i>>4;if(k<m)o[k++]=i<<4|j>>2;if(k<m)o[k++]=j<<6|h[q.charCodeAt(c+3)]}return o}function r(s){n(g,1024,"My40OS4xAHt9ACVzLiV6AGpzb25fcHJldHR5AGluZmluaXR5AGFmZmluaXR5AFJlYWxBZmZpbml0eQBidXN5AHRlbXBfc3RvcmVfZGlyZWN0b3J5AG5vdCBhIHdyaXRhYmxlIGRpcmVjdG9yeQBvcGVuRGlyZWN0b3J5AHNocmlua19tZW1vcnkAb3V0IG9mIG1lbW9yeQBmYWlsZWQgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgb2YgbWVtb3J5AEhBVklORyBjbGF1c2Ugb24gYSBub24tYWdncmVnYXRlIHF1ZXJ5AEludENvcHkAU0NvcHkAVkRlc3Ryb3kATXVsdGlwbHkAcXVlcnlfb25seQB1bmxpa2VseQB0YWJsZSAiJXMiIGhhcyBtb3JlIHRoYW4gb25lIHByaW1hcnkga2V5AGZvcmVpZ24ga2V5AGpzb25fZ3JvdXBfYXJyYXkAanNvbmJfZ3JvdXBfYXJyYXkAanNvbl9hcnJheQBqc29uYl9hcnJheQBqdWxpYW5kYXkAZnRzNGF1eAB2YWN1dW1fJTAxNmxseAB1bml4AHNxbGl0ZV9yZW5hbWVfcXVvdGVmaXgAcHJlZml4AExJS0Ugb3IgR0xPQiBwYXR0ZXJuIHRvbyBjb21wbGV4AHVuaGV4AGNoYXJpbmRleABPcGVuQXV0b2luZGV4AGF1dG9tYXRpY19pbmRleABhdXRvLWluZGV4AG9ycGhhbiBpbmRleABEcm9wSW5kZXgAaWR4AFJlb3BlbklkeABwY3gAbWF4AE1lbU1heAAlMDJ4ADB4ACBGUk9NICclcScuJyVxJXMnIEFTIHgAQ1JFQVRFIFRBQkxFIHgAcncAcHNvdwBpbXBsaWVzX25vbm51bGxfcm93AG5vdwBpbnRlZ2VyIG92ZXJmbG93AHdpbmRvdwBzaGFkb3cAUmVzdWx0Um93AElmTnVsbFJvdwBuZXcAbm8gc3VjaCB2aWV3AGNhbm5vdCBtb2RpZnkgJXMgYmVjYXVzZSBpdCBpcyBhIHZpZXcAQ2Fubm90IGFkZCBhIGNvbHVtbiB0byBhIHZpZXcAY2Fubm90IFVQU0VSVCBhIHZpZXcAUHJldgBzdGRldgAgJWxsdQAlYyV1AEZhaWxlZCB0byByZWFkIHB0cm1hcCBrZXk9JXUAJS4qejoldQBPZmZzZXQgJXUgb3V0IG9mIHJhbmdlICV1Li4ldQBpbnZhbGlkIHBhZ2UgbnVtYmVyICV1AGZhaWxlZCB0byBnZXQgcGFnZSAldQAybmQgcmVmZXJlbmNlIHRvIHBhZ2UgJXUARnJhZ21lbnRhdGlvbiBvZiAldSBieXRlcyByZXBvcnRlZCBhcyAldSBvbiBwYWdlICV1AGZyZWVsaXN0IGxlYWYgY291bnQgdG9vIGJpZyBvbiBwYWdlICV1AE11bHRpcGxlIHVzZXMgZm9yIGJ5dGUgJXUgb2YgcGFnZSAldQAlcyBpcyAldSBidXQgc2hvdWxkIGJlICV1AHVuYWJsZSB0byB1c2UgZnVuY3Rpb24gJXMgaW4gdGhlIHJlcXVlc3RlZCBjb250ZXh0AFNvcnRlck5leHQAVk5leHQAaW5jb21wbGV0ZSBpbnB1dABidXN5X3RpbWVvdXQAbG9jYWxob3N0AGNhbm5vdCBkcm9wIGNvbHVtbiAiJXMiOiBubyBvdGhlciBjb2x1bW5zIGV4aXN0AHBlcnNpc3QAZm9yZWlnbl9rZXlfbGlzdABpbmRleF9saXN0AGZ1bmN0aW9uX2xpc3QAY29sbGF0aW9uX2xpc3QAZGF0YWJhc2VfbGlzdABtb2R1bGVfbGlzdABQUkFHTUEgdGFibGVfbGlzdABwcmFnbWFfbGlzdABzZXQgbGlzdABWYWx1ZUxpc3QAc3FsaXRlX3JlbmFtZV90ZXN0AFJvd1NldFRlc3QAU2VxdWVuY2VUZXN0AGZhc3QATGFzdABDYXN0AHNxcnQAU29ydGVyU29ydAAiXC9iZm5ydABqc29uX2luc2VydABqc29uYl9pbnNlcnQASWR4SW5zZXJ0AFNvcnRlckluc2VydAByZXN0YXJ0AGNvdABCaXROb3QASWZOb3QAUGFnZWNvdW50AGZyZWVsaXN0X2NvdW50AG1heF9wYWdlX2NvdW50AFJlc2V0Q291bnQAd2FsX2F1dG9jaGVja3BvaW50AHdhbF9jaGVja3BvaW50AENoZWNrcG9pbnQAU2F2ZXBvaW50AGEgQ0hFQ0sgY29uc3RyYWludAAlc09OIENPTkZMSUNUIGNsYXVzZSBkb2VzIG5vdCBtYXRjaCBhbnkgUFJJTUFSWSBLRVkgb3IgVU5JUVVFIGNvbnN0cmFpbnQAQ3Vyc29ySGludABfY29udGVudABwYXJlbnQARElTVElOQ1QgYWdncmVnYXRlcyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgYXJndW1lbnQAY29tbWVudABBUEkgY2FsbGVkIHdpdGggZmluYWxpemVkIHByZXBhcmVkIHN0YXRlbWVudABBUEkgY2FsbGVkIHdpdGggTlVMTCBwcmVwYXJlZCBzdGF0ZW1lbnQATWF4UGdjbnQAZGVmYXVsdCB2YWx1ZSBvZiBjb2x1bW4gWyVzXSBpcyBub3QgY29uc3RhbnQATXVzdEJlSW50AENhbm5vdCBhZGQgYSBjb2x1bW4gd2l0aCBub24tY29uc3RhbnQgZGVmYXVsdABIYWx0AGxhbm9pdABzdGF0X2luaXQASW5pdABBdXRvQ29tbWl0AGFuYWx5c2lzX2xpbWl0AHNvZnRfaGVhcF9saW1pdABoYXJkX2hlYXBfbGltaXQAam91cm5hbF9zaXplX2xpbWl0AE9mZnNldExpbWl0AFNlZWtIaXQAT04gY2xhdXNlIHJlZmVyZW5jZXMgdGFibGVzIHRvIGl0cyByaWdodABTaGlmdFJpZ2h0AGhnaHQAU2hpZnRMZWZ0AE9mZnNldAByZXNldABqc29uX3NldABqc29uYl9zZXQAdG9vIG1hbnkgY29sdW1ucyBpbiByZXN1bHQgc2V0ACVyIE9SREVSIEJZIHRlcm0gZG9lcyBub3QgbWF0Y2ggYW55IGNvbHVtbiBpbiB0aGUgcmVzdWx0IHNldABzbmlwcGV0AHN0YXRfZ2V0AHNxbGl0ZV9jb21waWxlb3B0aW9uX2dldABzdHJpY3QATm9Db25mbGljdABqc29uX2dyb3VwX29iamVjdABqc29uYl9ncm91cF9vYmplY3QAanNvbl9vYmplY3QAanNvbmJfb2JqZWN0AGpzb25fZXh0cmFjdABqc29uYl9leHRyYWN0AFN1YnRyYWN0AGxzdGF0AGZzdGF0ACVzX3N0YXQAdGJsLGlkeCxzdGF0AHVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0AGdyb3VwX2NvbmNhdABDb25jYXQATHQAR3QAZGVmZXJfZm9yZWlnbl9rZXlzAGFsd2F5cwBwYXJhbWV0ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiB2aWV3cwBjb25jYXRfd3MAc3RhdHVzAHN5bmNocm9ub3VzAGluZGV4ICVzIGFscmVhZHkgZXhpc3RzAG91dHB1dCBmaWxlIGFscmVhZHkgZXhpc3RzACVzICVUIGFscmVhZHkgZXhpc3RzAHRyaWdnZXIgJVQgYWxyZWFkeSBleGlzdHMATm90RXhpc3RzAGlnbm9yZV9jaGVja19jb25zdHJhaW50cwBDSEVDSyBjb25zdHJhaW50cwBleHByZXNzaW9ucyBwcm9oaWJpdGVkIGluIFBSSU1BUlkgS0VZIGFuZCBVTklRVUUgY29uc3RyYWludHMAanNvbl9vYmplY3QoKSByZXF1aXJlcyBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMAanNvbl8lcygpIG5lZWRzIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzACVzX3NlZ21lbnRzAHVuYWJsZSB0byBkZWxldGUvbW9kaWZ5IHVzZXItZnVuY3Rpb24gZHVlIHRvIGFjdGl2ZSBzdGF0ZW1lbnRzAHVuYWJsZSB0byBkZWxldGUvbW9kaWZ5IGNvbGxhdGlvbiBzZXF1ZW5jZSBkdWUgdG8gYWN0aXZlIHN0YXRlbWVudHMAb2Zmc2V0cwByZXZlcnNlX3Vub3JkZXJlZF9zZWxlY3RzAGlpc3Nzc3NzAGlzcwBzZXNzAHVuY29tcHJlc3MAY2Fubm90IG9wZW4gc2F2ZXBvaW50IC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAY2Fubm90IHJlbGVhc2Ugc2F2ZXBvaW50IC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAY2Fubm90IGNvbW1pdCB0cmFuc2FjdGlvbiAtIFNRTCBzdGF0ZW1lbnRzIGluIHByb2dyZXNzAGNhbm5vdCBWQUNVVU0gLSBTUUwgc3RhdGVtZW50cyBpbiBwcm9ncmVzcwBhY2Nlc3MAcGFyYW1ldGVycwByZWN1cnNpdmVfdHJpZ2dlcnMAdGhlIElOREVYRUQgQlkgY2xhdXNlIGlzIG5vdCBhbGxvd2VkIG9uIFVQREFURSBvciBERUxFVEUgc3RhdGVtZW50cyB3aXRoaW4gdHJpZ2dlcnMAdGhlIE5PVCBJTkRFWEVEIGNsYXVzZSBpcyBub3QgYWxsb3dlZCBvbiBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudHMgd2l0aGluIHRyaWdnZXJzAHF1YWxpZmllZCB0YWJsZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQgb24gSU5TRVJULCBVUERBVEUsIGFuZCBERUxFVEUgc3RhdGVtZW50cyB3aXRoaW4gdHJpZ2dlcnMAQ2hpbGQgcGFnZSBkZXB0aCBkaWZmZXJzAHVuYWJsZSB0byBjbG9zZSBkdWUgdG8gdW5maW5hbGl6ZWQgc3RhdGVtZW50cyBvciB1bmZpbmlzaGVkIGJhY2t1cHMAYWNvcwBJZlBvcwBjb21waWxlX29wdGlvbnMARElTVElOQ1QgaXMgbm90IHN1cHBvcnRlZCBmb3Igd2luZG93IGZ1bmN0aW9ucwBGSUxURVIgY2xhdXNlIG1heSBvbmx5IGJlIHVzZWQgd2l0aCBhZ2dyZWdhdGUgd2luZG93IGZ1bmN0aW9ucwBub24tZGV0ZXJtaW5pc3RpYyBmdW5jdGlvbnMAaW5kZXggZXhwcmVzc2lvbnMAU0VMRUNUcyB0byB0aGUgbGVmdCBhbmQgcmlnaHQgb2YgJXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJlc3VsdCBjb2x1bW5zAHZpcnR1YWwgdGFibGVzIGNhbm5vdCB1c2UgY29tcHV0ZWQgY29sdW1ucwBnZW5lcmF0ZWQgY29sdW1ucwB0YWJsZSAlcyBoYXMgJWQgdmFsdWVzIGZvciAlZCBjb2x1bW5zAHJhZGlhbnMAYWxsIFZBTFVFUyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHRlcm1zAGVtcHR5X3Jlc3VsdF9jYWxsYmFja3MATG9hZEFuYWx5c2lzAGZsZ3MAZmxhZ3MAdmZzACVkIGNvbHVtbnMgYXNzaWduZWQgJWQgdmFsdWVzAEpTT04gY2Fubm90IGhvbGQgQkxPQiB2YWx1ZXMAZmFpbGVkIG1lbW9yeSByZXNpemUgJXUgdG8gJXUgYnl0ZXMAcGFydGlhbCBpbmRleCBXSEVSRSBjbGF1c2VzAHNob3J0X2NvbHVtbl9uYW1lcwBmdWxsX2NvbHVtbl9uYW1lcwB1bmFibGUgdG8gb3BlbiBhIHRlbXBvcmFyeSBkYXRhYmFzZSBmaWxlIGZvciBzdG9yaW5nIHRlbXBvcmFyeSB0YWJsZXMAY2Fubm90IGNyZWF0ZSB0cmlnZ2VycyBvbiBzaGFkb3cgdGFibGVzAGNhbm5vdCBjcmVhdGUgdHJpZ2dlcnMgb24gdmlydHVhbCB0YWJsZXMAJXMgUkVUVVJOSU5HIGlzIG5vdCBhdmFpbGFibGUgb24gdmlydHVhbCB0YWJsZXMAY2Fubm90IGpvaW4gdXNpbmcgY29sdW1uICVzIC0gY29sdW1uIG5vdCBwcmVzZW50IGluIGJvdGggdGFibGVzAEFVVE9JTkNSRU1FTlQgbm90IGFsbG93ZWQgb24gV0lUSE9VVCBST1dJRCB0YWJsZXMAJXMgY2Fubm90IHVzZSB2YXJpYWJsZXMAdG9vIG1hbnkgU1FMIHZhcmlhYmxlcwBzdWJxdWVyaWVzAGNhbm5vdCB1c2Ugd2luZG93IGZ1bmN0aW9ucyBpbiByZWN1cnNpdmUgcXVlcmllcwBjb3VudF9jaGFuZ2VzAHRvdGFsX2NoYW5nZXMAZGVncmVlcwBSRVRVUk5JTkcgbWF5IG5vdCB1c2UgIlRBQkxFLioiIHdpbGRjYXJkcwB0aHJlYWRzAGFicwAuJS4qcwBDUkVBVEUgJXMgJS4qcwBDUkVBVEUlcyBJTkRFWCAlLipzAGludmFsaWQgdXJpIGF1dGhvcml0eTogJS4qcwB1bmtub3duIHRhYmxlIG9wdGlvbjogJS4qcwAlLipzJXMALCVzJXMlcwBTQ0FOICVzJXMlcwBzcWxpdGVfYWx0ZXJ0YWJfJXMAU0NBTiAlZCBDT05TVEFOVCBST1clcwAlUSVzADB4JXg6JXMAJWQ6JXMAJXM6ICVzLiVzLiVzAG1pc3NpbmcgZGF0YXR5cGUgZm9yICVzLiVzAGNhbm5vdCBzdG9yZSAlcyB2YWx1ZSBpbiAlcyBjb2x1bW4gJXMuJXMAbm9uLSVzIHZhbHVlIGluICVzLiVzAFRFWFQgdmFsdWUgaW4gJXMuJXMATlVMTCB2YWx1ZSBpbiAlcy4lcwBOVU1FUklDIHZhbHVlIGluICVzLiVzAG1hbGZvcm1lZCBpbnZlcnRlZCBpbmRleCBmb3IgRlRTJWQgdGFibGUgJXMuJXMAJXM6ICVzLiVzAG5vIHN1Y2ggdGFibGUgY29sdW1uOiAlcy4lcwAuLiVzACUuMThzLSVzAHN1YnJ0bnNpZzolZCwlcwAgVVNJTkcgSU5URUdFUiBQUklNQVJZIEtFWSAoJXMAdXNlIERST1AgVklFVyB0byBkZWxldGUgdmlldyAlcwByb3cgbm90IGluIFBSSU1BUlkgS0VZIG9yZGVyIGZvciAlcwBpbGxlZ2FsIGZpcnN0IGFyZ3VtZW50IHRvICVzAG1pc3VzZSBvZiBhbGlhc2VkIHdpbmRvdyBmdW5jdGlvbiAlcwB0b28gbWFueSBjb2x1bW5zIG9uICVzAHRvbyBtYW55IGNvbHVtbnMgaW4gJXMAJXMgcHJvaGliaXRlZCBpbiAlcwBDSEVDSyBjb25zdHJhaW50IGZhaWxlZCBpbiAlcwBub24tZGV0ZXJtaW5pc3RpYyB1c2Ugb2YgJXMoKSBpbiAlcwByZWNvdmVyZWQgJWQgcGFnZXMgZnJvbSAlcwBtaXN1c2Ugb2YgYWxpYXNlZCBhZ2dyZWdhdGUgJXMAJXMgJVQgY2Fubm90IHJlZmVyZW5jZSBvYmplY3RzIGluIGRhdGFiYXNlICVzAGNhbm5vdCBkZXRhY2ggZGF0YWJhc2UgJXMAYSBKT0lOIGNsYXVzZSBpcyByZXF1aXJlZCBiZWZvcmUgJXMAY2Fubm90IG9wZW4gdmFsdWUgb2YgdHlwZSAlcwBjYW5ub3QgZnN0YXQgZGIgZmlsZSAlcwByZWNvdmVyZWQgJWQgZnJhbWVzIGZyb20gV0FMIGZpbGUgJXMAUFJJTUFSWSBLRVkgbWlzc2luZyBvbiB0YWJsZSAlcwB1c2UgRFJPUCBUQUJMRSB0byBkZWxldGUgdGFibGUgJXMAU0VMRUNUICVzIE9SREVSIEJZIHJvd2lkICVzAFNFTEVDVCAlcyBXSEVSRSByb3dpZCBCRVRXRUVOICVsbGQgQU5EICVsbGQgT1JERVIgQlkgcm93aWQgJXMAdGhlcmUgaXMgYWxyZWFkeSBhbiBpbmRleCBuYW1lZCAlcwB0YWJsZSAlUyBoYXMgbm8gY29sdW1uIG5hbWVkICVzAHRoZXJlIGlzIGFscmVhZHkgYSB0YWJsZSBuYW1lZCAlcwBzdGF0ZW1lbnQgYWJvcnRzIGF0ICVkOiBbJXNdICVzAENPVkVSSU5HIElOREVYICVzAFNFTEVDVCAlcwB1bnN1cHBvcnRlZCB1c2Ugb2YgTlVMTFMgJXMAQVRUQUNIICVRIEFTICVzAFVTRSBURU1QIEItVFJFRSBGT1IgJXMALS0gVFJJR0dFUiAlcwBSSUdIVC1KT0lOICVzAD4/IEFORCAlcwAlejogJXMAcmVjdXJzaXZlIHJlZmVyZW5jZSBpbiBhIHN1YnF1ZXJ5OiAlcwB2dGFibGUgY29uc3RydWN0b3IgY2FsbGVkIHJlY3Vyc2l2ZWx5OiAlcwBubyBzdWNoIGluZGV4OiAlcwBubyBzdWNoIHdpbmRvdzogJXMAY2Fubm90IG92ZXJyaWRlICVzIG9mIHdpbmRvdzogJXMAY2Fubm90IG9wZW4gdmlldzogJXMAbm8gc3VjaCBzYXZlcG9pbnQ6ICVzAGNhbm5vdCBvcGVuIHRhYmxlIHdpdGggZ2VuZXJhdGVkIGNvbHVtbnM6ICVzAG5vIHN1Y2ggdmZzOiAlcwBtdWx0aXBsZSByZWN1cnNpdmUgcmVmZXJlbmNlczogJXMAZXJyb3IgaW4gJXMgJXMlcyVzOiAlcwB1bmFibGUgdG8gdmFsaWRhdGUgdGhlIGludmVydGVkIGluZGV4IGZvciBGVFMlZCB0YWJsZSAlcy4lczogJXMAZXJyb3IgaW4gJXMgJXMgYWZ0ZXIgJXM6ICVzAHVua25vd24gdG9rZW5pemVyOiAlcwBlcnJvciBwYXJzaW5nIHByZWZpeCBwYXJhbWV0ZXI6ICVzAHVucmVjb2duaXplZCBwYXJhbWV0ZXI6ICVzAHVucmVjb2duaXplZCBvcmRlcjogJXMAdW5yZWNvZ25pemVkIG1hdGNoaW5mbzogJXMAbm8gc3VjaCBjb2x1bW46ICVzAGZpbGUgcmVuYW1lZCB3aGlsZSBvcGVuOiAlcwBmaWxlIHVubGlua2VkIHdoaWxlIG9wZW46ICVzAHVuc3VwcG9ydGVkIGVuY29kaW5nOiAlcwBjYW5ub3QgbGltaXQgV0FMIHNpemU6ICVzAE1KIGRlbGV0ZTogJXMAdGFyZ2V0IG9iamVjdC9hbGlhcyBtYXkgbm90IGFwcGVhciBpbiBGUk9NIGNsYXVzZTogJXMAb2JqZWN0IG5hbWUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogJXMAdW5rbm93biBkYXRhYmFzZTogJXMAdW5hYmxlIHRvIG9wZW4gZGF0YWJhc2U6ICVzAG5vIHN1Y2ggZGF0YWJhc2U6ICVzAHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciB0YWJsZSBvciBpbmRleCB3aXRoIHRoaXMgbmFtZTogJXMAZHVwbGljYXRlIGNvbHVtbiBuYW1lOiAlcwBkdXBsaWNhdGUgV0lUSCB0YWJsZSBuYW1lOiAlcwBubyBzdWNoIG1vZHVsZTogJXMAbXVsdGlwbGUgbGlua3MgdG8gZmlsZTogJXMAY2Fubm90IG9wZW4gdmlydHVhbCB0YWJsZTogJXMAbm8gc3VjaCB0YWJsZTogJXMAbXVsdGlwbGUgcmVmZXJlbmNlcyB0byByZWN1cnNpdmUgdGFibGU6ICVzAG5vIHN1Y2ggJXMgbW9kZTogJXMATUogY29sbGlkZTogJXMAbm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6ICVzAGNpcmN1bGFyIHJlZmVyZW5jZTogJXMAY2Fubm90IG9wZW4gdGFibGUgd2l0aG91dCByb3dpZDogJXMAJXMgbW9kZSBub3QgYWxsb3dlZDogJXMAdnRhYmxlIGNvbnN0cnVjdG9yIGZhaWxlZDogJXMAYXV0b21hdGljIGV4dGVuc2lvbiBsb2FkaW5nIGZhaWxlZDogJXMAZGF0YWJhc2UgdGFibGUgaXMgbG9ja2VkOiAlcwBkYXRhYmFzZSBzY2hlbWEgaXMgbG9ja2VkOiAlcwB2dGFibGUgY29uc3RydWN0b3IgZGlkIG5vdCBkZWNsYXJlIHNjaGVtYTogJXMAYWJvcnQgYXQgJWQgaW4gWyVzXTogJXMALS0gJXMAJXogLSAlcwBvc191bml4LmM6JWQ6ICglZCkgJXMoJXMpIC0gJXMAd3IAcmlnaHRzdHIAbGVmdHN0cgBpbnN0cgBzdWJzdHIAZXhwcl9pbXBsaWVzX2V4cHIAaW52YWxpZCBhcmd1bWVudHMgdG8gZnRzNGF1eCBjb25zdHJ1Y3RvcgBtaXNzaW5nICVzIHBhcmFtZXRlciBpbiBmdHM0IGNvbnN0cnVjdG9yAHRoZSAiLiIgb3BlcmF0b3IAZnRzM2N1cnNvcgBuZWFyICIlVCI6IHN5bnRheCBlcnJvcgBpbnRlcm5hbCBxdWVyeSBwbGFubmVyIGVycm9yAHVua25vd24gZXJyb3IAVW5rbm93biBlcnJvcgBkb21haW4gZXJyb3IAbm90IGFuIGVycm9yAFNRTCBsb2dpYyBlcnJvcgBkaXNrIEkvTyBlcnJvcgBmbG9vcgBybWRpcgBta2RpcgBzZWdkaXIAZnRzM190b2tlbml6ZXIAdW5rbm93biB0b2tlbml6ZXIAcG93ZXIAbG93ZXIAc3FsaXRlX3RlbXBfbWFzdGVyAHNxbGl0ZV9tYXN0ZXIAcG9ydGVyAFJlc2V0U29ydGVyAEZrQ291bnRlcgBBUEkgY2FsbCB3aXRoICVzIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9pbnRlcgBzdHJmaWx0ZXIAVkZpbHRlcgBFU0NBUEUgZXhwcmVzc2lvbiBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlcgB1cHBlcgBwcm9wZXIAY2Fubm90IHVzZSBSRVRVUk5JTkcgaW4gYSB0cmlnZ2VyAERyb3BUcmlnZ2VyAHNlY29uZCBhcmd1bWVudCB0byBudGhfdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIAYXJndW1lbnQgb2YgbnRpbGUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIAZnJhbWUgc3RhcnRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcgBmcmFtZSBlbmRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcgBJbnRlZ2VyAFJvd2lkICVsbGQgb3V0IG9mIG9yZGVyAFJlbWFpbmRlcgBmcmFtZSBzdGFydGluZyBvZmZzZXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIAZnJhbWUgZW5kaW5nIG9mZnNldCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcgBhZGRyAHBhZHIAY2hhcgB5ZWFyAENsZWFyAEJpdE9yAHNlcQBDb2xsU2VxAEVsc2VFcQByZWdleHAAT3BlbkR1cABOb29wAEp1bXAAL3Vzci90bXAAL3Zhci90bXAAdGVtcABjdXJyZW50X3RpbWVzdGFtcABBZ2dTdGVwAG1vZGVTdGVwAHZhcmlhbmNlU3RlcABtdW5tYXAAbW1hcABtcmVtYXAAc3FsaXRlX3JldHVybmluZ18lcAB2dGFiOiVwAHNzZW5zdW8AaWxzdW8AYXV0bwBHb3RvAGludG8AaW5jcmVtZW50YWxfdmFjdXVtIGVuYWJsZWQgd2l0aCBhIG1heCByb290cGFnZSBvZiB6ZXJvAElmTm90WmVybwBEZWNySnVtcFplcm8ARmtJZlplcm8Ac2Vxbm8AaW5kZXhfeGluZm8AdGFibGVfeGluZm8AbWF0Y2hpbmZvAGluZGV4X2luZm8AdGFibGVfaW5mbwBPcGVuUHNldWRvAGZjaG93bgBCZWdpblN1YnJ0bgBSZXR1cm4AanNvbgBubyBxdWVyeSBzb2x1dGlvbgBpbmRleCBjb3JydXB0aW9uAGRhdGFiYXNlIGNvcnJ1cHRpb24AZnJlZSBzcGFjZSBjb3JydXB0aW9uAGpzb25fZXJyb3JfcG9zaXRpb24AdW5rbm93biBjb2x1bW4gIiVzIiBpbiBmb3JlaWduIGtleSBkZWZpbml0aW9uACVzLnhCZXN0SW5kZXggbWFsZnVuY3Rpb24AYXV0aG9yaXplciBtYWxmdW5jdGlvbgAlI1QoKSBtYXkgbm90IGJlIHVzZWQgYXMgYSB3aW5kb3cgZnVuY3Rpb24AJyVzJyBpcyBub3QgYSBmdW5jdGlvbgBGdW5jdGlvbgBjYW5ub3Qgc3RhcnQgYSB0cmFuc2FjdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbgBjYW5ub3QgY2hhbmdlICVzIHdhbCBtb2RlIGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24AdGVtcG9yYXJ5IHN0b3JhZ2UgY2Fubm90IGJlIGNoYW5nZWQgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbgBjYW5ub3QgVkFDVVVNIGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24AU2FmZXR5IGxldmVsIG1heSBub3QgYmUgY2hhbmdlZCBpbnNpZGUgYSB0cmFuc2FjdGlvbgBUcmFuc2FjdGlvbgBQZXJtdXRhdGlvbgB1bmtub3duIG9wZXJhdGlvbgB1bnN1cHBvcnRlZCBmcmFtZSBzcGVjaWZpY2F0aW9uAFJBTkdFIHdpdGggb2Zmc2V0IFBSRUNFRElORy9GT0xMT1dJTkcgcmVxdWlyZXMgb25lIE9SREVSIEJZIGV4cHJlc3Npb24AdG9vIG1hbnkgbGV2ZWxzIG9mIHRyaWdnZXIgcmVjdXJzaW9uAHVzZXJfdmVyc2lvbgBzcWxpdGVfdmVyc2lvbgBkYXRhX3ZlcnNpb24Ac2NoZW1hX3ZlcnNpb24Ac3FsaXRlX2Ryb3BfY29sdW1uAHNxbGl0ZV9yZW5hbWVfY29sdW1uAGFmdGVyIGRyb3AgY29sdW1uAG5vIHN1Y2ggY29sdW1uAG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLWdlbmVyYXRlZCBjb2x1bW4AY2Fubm90IHVzZSBERUZBVUxUIG9uIGEgZ2VuZXJhdGVkIGNvbHVtbgBhZGQgY29sdW1uAENhbm5vdCBhZGQgYSBQUklNQVJZIEtFWSBjb2x1bW4AQ2Fubm90IGFkZCBhIFVOSVFVRSBjb2x1bW4AY2Fubm90IGFkZCBhIFNUT1JFRCBjb2x1bW4AVkNvbHVtbgBidWlsdGluAGFzaW4AYXQgbW9zdCAlZCB0YWJsZXMgaW4gYSBqb2luAG1pbgBvcmlnaW4AVkJlZ2luAG1haW4ARXhwbGFpbgBzaWduAHNzZW4Ab3BlbgBJZk5vdE9wZW4AU29ydGVyT3BlbgBWT3BlbgBJZlNpemVCZXR3ZWVuAGhpZGRlbgBhdGFuAG1lZGlhbgBTZWVrU2NhbgBWSW5pdEluAGF1dG9fdmFjdXVtAGluY3JlbWVudGFsX3ZhY3V1bQBJbmNyVmFjdXVtAHN1bQBmbGV4bnVtAHBtAGRyb3AgY29sdW1uIGZyb20AL2Rldi91cmFuZG9tAEFkZEltbQBydHJpbQBsdHJpbQByZWFkb25seV9zaG0AJXMtc2htAHRuZW0AUkFJU0UoKSBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBhIHRyaWdnZXItcHJvZ3JhbQBQcm9ncmFtAFBhcmFtAGZ1bABmY250bABpb2N0bABpZ29sAGxvY2tpbmcgcHJvdG9jb2wAbmNvbABub3RudWxsAGlmbnVsbAAvZGV2L251bGwAZGF0YWJhc2Ugb3IgZGlzayBpcyBmdWxsAE5vdE51bGwAU29mdE51bGwASXNOdWxsAFplcm9Pck51bGwASGFsdElmTnVsbABjb2xsAGNhY2hlX3NwaWxsAFJvd0NlbGwAY2VpbABkZXRhaWwAcGFkbAB1bml4LWV4Y2wAdGJsAHdhbAB2aXJ0dWFsAHRvdGFsAGluY3JlbWVudGFsAE9wZW5FcGhlbWVyYWwAQWdnRmluYWwAbm9ybWFsAEluZGV4IGFscmVhZHkgb3B0aW1hbABwYXJ0aWFsAHJlYWwAUmVhbABwawBvawB1bmxpbmsAcmVhZGxpbmsARmluaXNoU2VlawBEZWZlcnJlZFNlZWsAbm9sb2NrAEN1cnNvclVubG9jawBibG9jawAlcy5sb2NrAEN1cnNvckxvY2sAVGFibGVMb2NrAGludGVncml0eV9jaGVjawBmb3JlaWduX2tleV9jaGVjawBxdWlja19jaGVjawBjZWxsX3NpemVfY2hlY2sAaW50ZWdyaXR5LWNoZWNrAEZrQ2hlY2sAVHlwZUNoZWNrAFZDaGVjawBJbnRlZ3JpdHlDawByZXppAG5vaXRhemkAaXRpdmkAc3NlbmV2aQBpdGkAaXNzaXNpAGlzaXNpAHBpAG5vaQBnbmkAc2lzc2lpAGlzc2lzaWkAc3NzaWlpAHNlaQBpdGljaQBldGFjaQBsYWNpAGNvdGgAbW9udGgAanNvbl9hcnJheV9sZW5ndGgAb2N0ZXRfbGVuZ3RoAG92ZXJmbG93IGxpc3QgbGVuZ3RoAHdkdGgAc3RhdF9wdXNoAGZsdXNoAGFjb3NoAGFzaW5oAGF0YW5oAGpzb25fcGF0Y2gAanNvbmJfcGF0Y2gAZGF0YXR5cGUgbWlzbWF0Y2gAYXJndW1lbnQgdHlwZSBtaXNtYXRjaABhYmJyZXZpYXRlZCBxdWVyeSBhbGdvcml0aG0gc2VhcmNoAHVuaXhlcG9jaABzcWxpdGVfYXR0YWNoAHNxbGl0ZV9kZXRhY2gAanNvbl9lYWNoAGF2ZwBuYXJnAHNxbGl0ZV9sb2cAc3RhdGVtZW50IHRvbyBsb25nAGNhbm5vdCBvcGVuICVzIGNvbHVtbiBmb3Igd3JpdGluZwBzdWJzdHJpbmcAU3RyaW5nAGNlaWxpbmcAZW5jb2RpbmcAc3RyaW5nIG9yIGJsb2IgdG9vIGJpZwBzdHJpbmdfYWdnAFJlbGVhc2VSZWcAJS4xNmcAJSEwLjE1ZwAlIS4xNWcAc3Nlbmx1ZgBwcmludGYAdHlwZW9mAG1vZGVvZgBvdXQgb2YAcmVuYW1lIGNvbHVtbnMgb2YAaW5mAC1JbmYAbnVsbGlmAGlpZgBvZmYAdGltZWRpZmYAMDEyMzQ1Njc4OWFiY2RlZgBJZgAlYyUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDYuM2YAJS4zZgA1MGYANDBmACUhLipmAGdldHBhZ2VzaXplAGRvY3NpemUAbW1hcF9zaXplAGRlZmF1bHRfY2FjaGVfc2l6ZQBQUkFHTUEgJVEucGFnZV9zaXplAGZ0czN0b2tlbml6ZQBvcHRpbWl6ZQBqc29uX3JlbW92ZQBqc29uYl9yZW1vdmUATW92ZQBjYW5ub3QgY29tbWl0IC0gbm8gdHJhbnNhY3Rpb24gaXMgYWN0aXZlAGNhbm5vdCByb2xsYmFjayAtIG5vIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZQBleGNsdXNpdmUAdHJ1ZQBJc1RydWUAdW5pcXVlAGRmbHRfdmFsdWUAQ2Fubm90IGFkZCBhIFJFRkVSRU5DRVMgY29sdW1uIHdpdGggbm9uLU5VTEwgZGVmYXVsdCB2YWx1ZQBBZ2dWYWx1ZQBqc29uX3F1b3RlAHB3cml0ZQBPcGVuV3JpdGUAb25fZGVsZXRlAHNlY3VyZV9kZWxldGUASWR4RGVsZXRlAHByaXZhdGUAYWdncmVnYXRlAFZDcmVhdGUAb25fdXBkYXRlAFZVcGRhdGUAY3VycmVudF9kYXRlAGZhbGxvY2F0ZQBmdHJ1bmNhdGUAcmVwbGljYXRlAGJhZCBwYXJhbWV0ZXIgb3Igb3RoZXIgQVBJIG1pc3VzZQB0b28gbWFueSB0ZXJtcyBpbiAlcyBCWSBjbGF1c2UAdG9vIG1hbnkgdGVybXMgaW4gT1JERVIgQlkgY2xhdXNlAGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBHUk9VUCBCWSBjbGF1c2UAUEFSVElUSU9OIGNsYXVzZQBhIE5BVFVSQUwgam9pbiBtYXkgbm90IGhhdmUgYW4gT04gb3IgVVNJTkcgY2xhdXNlAGRhdGFiYXNlICVzIGlzIGFscmVhZHkgaW4gdXNlAEFnZ0ludmVyc2UAcmV2ZXJzZQBjbG9zZQBDbG9zZQBmYWxzZQBhdHRlbXB0IHRvIHdyaXRlIGEgcmVhZG9ubHkgZGF0YWJhc2UAY29ycnVwdCBkYXRhYmFzZQBhdHRhY2hlZCBkYXRhYmFzZXMgbXVzdCB1c2UgdGhlIHNhbWUgdGV4dCBlbmNvZGluZyBhcyBtYWluIGRhdGFiYXNlAGZpbGUgaXMgbm90IGEgZGF0YWJhc2UAdGVtcF9zdG9yZQAlcyBjbGF1c2Ugc2hvdWxkIGNvbWUgYWZ0ZXIgJXMgbm90IGJlZm9yZQBFeHBpcmUAc3F1YXJlAGV4cHJfY29tcGFyZQBTb3J0ZXJDb21wYXJlAHN1YnR5cGUAU2V0U3VidHlwZQBHZXRTdWJ0eXBlAENsclN1YnR5cGUAanNvbl90eXBlAElzVHlwZQBJZk5vSG9wZQBpbHRuZQB1bml4LW5vbmUASW5pdENvcm91dGluZQBFbmRDb3JvdXRpbmUAaWNuZQBsb2NhbHRpbWUAc3RyZnRpbWUAZGF0ZXRpbWUAY3VycmVudF90aW1lAHRuZW1lAGFmdGVyIHJlbmFtZQBub24tdGV4dCBmaWxlbmFtZQBWUmVuYW1lAGFtYmlndW91cyBjb2x1bW4gbmFtZQB0ZW1wb3JhcnkgdHJpZ2dlciBtYXkgbm90IGhhdmUgcXVhbGlmaWVkIG5hbWUAc2ltcGxlAGxvd2VyX3F1YXJ0aWxlAHVwcGVyX3F1YXJ0aWxlAHVuaXgtZG90ZmlsZQBjYW5ub3Qgb3BlbiBmaWxlAHVuYWJsZSB0byBvcGVuIGRhdGFiYXNlIGZpbGUAaW1tdXRhYmxlAEFib3J0YWJsZQBsZWdhY3lfYWx0ZXJfdGFibGUAc3FsaXRlX3JlbmFtZV90YWJsZQBjYW5ub3QgY3JlYXRlIHRyaWdnZXIgb24gc3lzdGVtIHRhYmxlAHZpcnR1YWwgdGFibGUAbm8gc3VjaCB0YWJsZQBudW1iZXIgb2YgY29sdW1ucyBpbiBmb3JlaWduIGtleSBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHJlZmVyZW5jZWQgdGFibGUAbG9jYWwgdGltZSB1bmF2YWlsYWJsZQBhbm90aGVyIHJvdyBhdmFpbGFibGUAbm8gbW9yZSByb3dzIGF2YWlsYWJsZQBWYXJpYWJsZQBEcm9wVGFibGUAdXRmMTZsZQBVVEYxNmxlAFVURi0xNmxlAGNhc2Vfc2Vuc2l0aXZlX2xpa2UAU2V0Q29va2llAFJlYWRDb29raWUAY2FjaGUAY29sdW1uIGluZGV4IG91dCBvZiByYW5nZQBub3RpZmljYXRpb24gbWVzc2FnZQB3YXJuaW5nIG1lc3NhZ2UAaW52YWxpZCByb290cGFnZQBFeHRlbmRzIG9mZiBlbmQgb2YgcGFnZQBNQVhfUEFHRV9DT1VOVD0weGZmZmZmZmZlAGpzb25fdHJlZQBDcmVhdGVCdHJlZQBkZWUAam91cm5hbF9tb2RlAGxvY2tpbmdfbW9kZQBvcGNvZGUAdW5pY29kZQBKb3VybmFsTW9kZQBEaXZpZGUAY29hbGVzY2UAc3FsaXRlX3NlcXVlbmNlAFNlcXVlbmNlAGRpZmZlcmVuY2UAdmFyaWFuY2UAT25jZQBUcmFjZQBqc29uX3JlcGxhY2UAanNvbmJfcmVwbGFjZQB1dGYxNmJlAFVURjE2YmUAVVRGLTE2YmUATmUATGUAR2UAMjBjOjIwZQAyMGI6MjBlACUhMC4yMGUAZ2V0Y3dkAE1ha2VSZWNvcmQAdGhzdG5kcmQAbGlrZWxpaG9vZABmY2htb2QAcm91bmQATm90Rm91bmQAc3Vic2Vjb25kAFJld2luZABTZWVrRW5kAEJpdEFuZABvbGQAJWxsZCAlbGxkAG5vIHN1Y2ggcm93aWQ6ICVsbGQAcmVidWlsZABZaWVsZABsYXN0X2luc2VydF9yb3dpZAAlcy5yb3dpZABTRUxFQ1QqRlJPTSIldyIuJXMgT1JERVIgQlkgcm93aWQAU0VMRUNUKkZST00iJXciLiVzIFdIRVJFICVzIE9SREVSIEJZIHJvd2lkAElkeFJvd2lkAE5ld1Jvd2lkAFNlZWtSb3dpZABnZXRldWlkAGludmFsaWQAanNvbl92YWxpZABma2lkAF9fbGFuZ2lkACV6LCBsYW5naWQAbGFuZ3VhZ2VpZABkb2NpZABhcHBsaWNhdGlvbl9pZABzcWxpdGVfc291cmNlX2lkAG5vdCBhdXRob3JpemVkAEluZGV4IG9wdGltaXplZABub3RpbmRleGVkAHVuYWJsZSB0byBpZGVudGlmeSB0aGUgb2JqZWN0IHRvIGJlIHJlaW5kZXhlZAB2aWV3cyBtYXkgbm90IGJlIGluZGV4ZWQAdmlydHVhbCB0YWJsZXMgbWF5IG5vdCBiZSBpbmRleGVkAHRhYmxlICVzIG1heSBub3QgYmUgaW5kZXhlZAByZWFkX3VuY29tbWl0dGVkAHJlY3Vyc2l2ZSBhZ2dyZWdhdGUgcXVlcmllcyBub3Qgc3VwcG9ydGVkAHF1ZXJ5IGFib3J0ZWQAcm93cyBpbnNlcnRlZABpbnRlcnJ1cHRlZABjaGVja3BvaW50ZWQAYWNjZXNzIHRvICV6IGlzIHByb2hpYml0ZWQAYWNjZXNzIHRvIHZpZXcgIiVzIiBwcm9oaWJpdGVkAHJvd3MgZGVsZXRlZABnZW5lcmF0ZWQAcm93cyB1cGRhdGVkAG5vdHVzZWQAcm93IHZhbHVlIG1pc3VzZWQAc3FsaXRlX2NvbXBpbGVvcHRpb25fdXNlZABQYWdlICV1OiBuZXZlciB1c2VkAENvbHVtbnNVc2VkAHN0b3JlZAB2aXJ0dWFsIHRhYmxlcyBtYXkgbm90IGJlIGFsdGVyZWQAdmlldyAlcyBtYXkgbm90IGJlIGFsdGVyZWQAdGFibGUgJXMgbWF5IG5vdCBiZSBhbHRlcmVkAHNoYXJlZABpbmRleCBhc3NvY2lhdGVkIHdpdGggVU5JUVVFIG9yIFBSSU1BUlkgS0VZIGNvbnN0cmFpbnQgY2Fubm90IGJlIGRyb3BwZWQAdGFibGUgJXMgbWF5IG5vdCBiZSBkcm9wcGVkAHZpZXcgJXMgaXMgY2lyY3VsYXJseSBkZWZpbmVkAHVub3BlbmVkAGRhdGFiYXNlIGRpc2sgaW1hZ2UgaXMgbWFsZm9ybWVkACVzIGNvbnN0cmFpbnQgZmFpbGVkAEZPUkVJR04gS0VZIGNvbnN0cmFpbnQgZmFpbGVkAGxhcmdlIGZpbGUgc3VwcG9ydCBpcyBkaXNhYmxlZABmdHMzdG9rZW5pemUgZGlzYWJsZWQAZGF0YWJhc2UgJXMgaXMgbG9ja2VkAGRhdGFiYXNlIGlzIGxvY2tlZABkYXRhYmFzZSB0YWJsZSBpcyBsb2NrZWQAYXV0aG9yaXphdGlvbiBkZW5pZWQAYWNjZXNzIHBlcm1pc3Npb24gZGVuaWVkAHRhYmxlICVTIGhhcyAlZCBjb2x1bW5zIGJ1dCAlZCB2YWx1ZXMgd2VyZSBzdXBwbGllZAB0ZW1wb3JhcnkgdGFibGUgbmFtZSBtdXN0IGJlIHVucXVhbGlmaWVkAHRhYmxlICVzIG1heSBub3QgYmUgbW9kaWZpZWQAY29uZmxpY3RpbmcgT04gQ09ORkxJQ1QgY2xhdXNlcyBzcGVjaWZpZWQAbm8gdGFibGVzIHNwZWNpZmllZABkYXRhYmFzZSBpcyBhbHJlYWR5IGF0dGFjaGVkAGRhdGFiYXNlIHNjaGVtYSBoYXMgY2hhbmdlZABleGNsdWRlZABQYWdlICV1OiBwb2ludGVyIG1hcCByZWZlcmVuY2VkAFJvd1NldEFkZABGaWx0ZXJBZGQAcHJlYWQAUm93U2V0UmVhZABPcGVuUmVhZAAlMDRkACUwM2QAJTAyZDolMDJkOiUwMmQAJTA0ZC0lMDJkLSUwMmQAJTJkADQwZi0yMWEtMjFkADUwZi0yMGEtMjBkADQwZi0yMGEtMjBkAHNxbGl0ZV9zdGF0JWQAY29sdW1uJWQAc3FsaXRlX2F1dG9pbmRleF8lc18lZAB2YXJpYWJsZSBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuID8xIGFuZCA/JWQAdW5hYmxlIHRvIGdldCB0aGUgcGFnZS4gZXJyb3IgY29kZT0lZABrKCVkAFVQREFURSAlUS5zcWxpdGVfbWFzdGVyIFNFVCByb290cGFnZT0lZCBXSEVSRSAjJWQgQU5EIHJvb3RwYWdlPSMlZABVUERBVEUgJVEuc3FsaXRlX21hc3RlciBTRVQgdHlwZT0nJXMnLCBuYW1lPSVRLCB0YmxfbmFtZT0lUSwgcm9vdHBhZ2U9IyVkLCBzcWw9JVEgV0hFUkUgcm93aWQ9IyVkAFVQREFURSAlUS5zcWxpdGVfbWFzdGVyIFNFVCB0eXBlPSd0YWJsZScsIG5hbWU9JVEsIHRibF9uYW1lPSVRLCByb290cGFnZT0wLCBzcWw9JVEgV0hFUkUgcm93aWQ9IyVkAHRvbyBtYW55IGF0dGFjaGVkIGRhdGFiYXNlcyAtIG1heCAlZAB0b28gbWFueSBhcmd1bWVudHMgb24gJXMoKSAtIG1heCAlZABleHBlY3RlZCAlZCBjb2x1bW5zIGZvciAnJXMnIGJ1dCBnb3QgJWQAYXR0ZW1wdCB0byBvcGVuICIlcyIgYXMgZmlsZSBkZXNjcmlwdG9yICVkAGJ0cmVlSW5pdFBhZ2UoKSByZXR1cm5zIGVycm9yIGNvZGUgJWQAJXIgJXMgQlkgdGVybSBvdXQgb2YgcmFuZ2UgLSBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAlZABzdWItc2VsZWN0IHJldHVybnMgJWQgY29sdW1ucyAtIGV4cGVjdGVkICVkAElOKC4uLikgZWxlbWVudCBoYXMgJWQgdGVybSVzIC0gZXhwZWN0ZWQgJWQAJXNMSVNUIFNVQlFVRVJZICVkAFJFVVNFIExJU1QgU1VCUVVFUlkgJWQAJXNTQ0FMQVIgU1VCUVVFUlkgJWQAUkVVU0UgU1VCUVVFUlkgJWQASU5ERVggJWQAdG9vIG1hbnkgRlJPTSBjbGF1c2UgdGVybXMsIG1heDogJWQAcndjAHV0YwBkZXNjAGFzYwBjaGVja3BvaW50X2Z1bGxmc3luYwBmdWxsX2ZzeW5jAGNoYXJpbmRleEZ1bmMAc3FydEZ1bmMAY290RnVuYwByaWdodEZ1bmMAbGVmdEZ1bmMAYWNvc0Z1bmMAZmxvb3JGdW5jAHBvd2VyRnVuYwBzdHJmaWx0ZXJGdW5jAHByb3BlckZ1bmMAcGFkckZ1bmMAZXhwRnVuYwBhc2luRnVuYwBzaWduRnVuYwBhdGFuRnVuYwBjZWlsRnVuYwBwYWRsRnVuYwBjb3RoRnVuYwBhY29zaEZ1bmMAYXNpbmhGdW5jAGF0YW5oRnVuYwBsb2dGdW5jAHJhZDJkZWdGdW5jAHJldmVyc2VGdW5jAFB1cmVGdW5jAHNxdWFyZUZ1bmMAZGlmZmVyZW5jZUZ1bmMAZGVnMnJhZEZ1bmMAcGFkY0Z1bmMAYXRuMkZ1bmMAbG9nMTBGdW5jAGVuYwBudW1lcmljADE9PWFyZ2MAU3FsRXhlYwBzdWJzZWMAcGFkYwAlLjRjJXMlLjE2YwBzcWxpdGUtc3JjL3NxbGl0ZS1hbWFsZ2FtYXRpb24tMzQ5MDEwMC9leHRlbnNpb24tZnVuY3Rpb25zLmMAJXMvZXRpbHFzXyVsbHglYwB1bnJlY29nbml6ZWQgbWF0Y2hpbmZvIHJlcXVlc3Q6ICVjAEdvc3ViAGdsb2IAemVyb2Jsb2IAcmFuZG9tYmxvYgBCbG9iAGpzb25iAGlsYgBpdGlsaWIAbWVtZGIAcm90YQBldml0YQBsYW5vaXRhAGV0YQBSb3dEYXRhAFNvcnRlckRhdGEAaWNuYQBzcWxpdGVfdGVtcF9zY2hlbWEAc3FsaXRlX3NjaGVtYQB3cml0YWJsZV9zY2hlbWEAdHJ1c3RlZF9zY2hlbWEAY29ycnVwdCBzY2hlbWEAUGFyc2VTY2hlbWEAaWxsYQBlemlsYQBpdGlsYQBtc2lsYQBzcWxpdGVfAHByYWdtYV8AU1FMSVRFXwBfUk9XSURfACVzIGF0IGxpbmUgJWQgb2YgWyUuMTBzXQBiaW5kIG9uIGEgYnVzeSBwcmVwYXJlZCBzdGF0ZW1lbnQ6IFslc10AbWFsZm9ybWVkIE1BVENIIGV4cHJlc3Npb246IFslc10AWyVsbGRdAFtdAFsATEVGVC1NT1NUIFNVQlFVRVJZAENPTVBPVU5EIFFVRVJZAEFOWQBnZW5lcmF0ZWQgY29sdW1ucyBjYW5ub3QgYmUgcGFydCBvZiB0aGUgUFJJTUFSWSBLRVkAQVVUT0lOQ1JFTUVOVCBpcyBvbmx5IGFsbG93ZWQgb24gYW4gSU5URUdFUiBQUklNQVJZIEtFWQBkb2NpZCBJTlRFR0VSIFBSSU1BUlkgS0VZAEZPUkVJR04gS0VZAFVTRSBURU1QIEItVFJFRSBGT1IgJXNPUkRFUiBCWQBVU0UgVEVNUCBCLVRSRUUgRk9SIExBU1QgJWQgVEVSTVMgT0YgT1JERVIgQlkAR1JPVVAgQlkAaWlzWABpc2lYAEFVVE9NQVRJQyBQQVJUSUFMIENPVkVSSU5HIElOREVYAEFVVE9NQVRJQyBDT1ZFUklORyBJTkRFWAAtbWolMDZYOSUwMlgAU0NBTiBDT05TVEFOVCBST1cAVklFVwBqc29uX29iamVjdCgpIGxhYmVscyBtdXN0IGJlIFRFWFQARklSU1QATEFTVABFWENFUFQATk9UACBJTlQASWR4TFQAU2Vla0xUAFNFVCBERUZBVUxUAE1VVEVYX09NSVQAQ09NTUlUAExJTUlUAFJJR0hUAElkeEdUAFNlZWtHVABMRUZUAERJU1RJTkNUAFJFU1RSSUNUAElOVEVSU0VDVAB0b28gbWFueSB0ZXJtcyBpbiBjb21wb3VuZCBTRUxFQ1QAdW5rbm93biBqb2luIHR5cGU6ICVUJXMlVCVzJVQALSVUAHRvbyBtYW55IGFyZ3VtZW50cyBvbiBmdW5jdGlvbiAlVAB1bmtub3duIGRhdGFiYXNlICVUAGZvcmVpZ24ga2V5IG9uICVzIHNob3VsZCByZWZlcmVuY2Ugb25seSBvbmUgY29sdW1uIG9mIHRhYmxlICVUAENSRUFURSBWSVJUVUFMIFRBQkxFICVUAGhleCBsaXRlcmFsIHRvbyBiaWc6ICVzJSNUAG5vIHN1Y2ggZnVuY3Rpb246ICUjVABub3QgYXV0aG9yaXplZCB0byB1c2UgZnVuY3Rpb246ICUjVABERUZBVUxUX1JFQ1VSU0lWRV9UUklHR0VSUwBFTkFCTEVfRlRTM19QQVJFTlRIRVNJUwBESVNBQkxFX0xGUwAlcyAlUwBTQ0FOICVTAG5vIHN1Y2ggaW5kZXg6ICVTAGNhbm5vdCBjcmVhdGUgJXMgdHJpZ2dlciBvbiB2aWV3OiAlUwBubyBzdWNoIHRyaWdnZXI6ICVTAGNhbm5vdCBjcmVhdGUgSU5TVEVBRCBPRiB0cmlnZ2VyIG9uIHRhYmxlOiAlUwBNQVRFUklBTElaRSAlIVMAQ08tUk9VVElORSAlIVMAVVNJTkcgSU5ERVggJXMgRk9SIElOLU9QRVJBVE9SAFVTSU5HIFJPV0lEIFNFQVJDSCBPTiBUQUJMRSAlcyBGT1IgSU4tT1BFUkFUT1IATVVMVEktSU5ERVggT1IAU1FMSVRFX1RNUERJUgBDUkVBVEUgQkxPT00gRklMVEVSAEFGVEVSAElOVEVHRVIAT1JERVIATkVBUgBERUxFVEUgRlJPTSAlUS4lcyBXSEVSRSAlcz0lUQBuYW1lPSVRIEFORCBzcWw9JVEAREVMRVRFIEZST00gJVEuc3FsaXRlX3NlcXVlbmNlIFdIRVJFIG5hbWU9JVEALCB4LiVRAFNFTEVDVCAqIEZST00gJVEuJVEAVVBEQVRFICIldyIuc3FsaXRlX3NlcXVlbmNlIHNldCBuYW1lID0gJVEgV0hFUkUgbmFtZSA9ICVRAFVQREFURSAiJXciLnNxbGl0ZV9tYXN0ZXIgU0VUIHNxbCA9IHByaW50ZignJSUuJWRzLCAnLHNxbCkgfHwgJVEgfHwgc3Vic3RyKHNxbCwxK2xlbmd0aChwcmludGYoJyUlLiVkcycsc3FsKSkpIFdIRVJFIHR5cGUgPSAndGFibGUnIEFORCBuYW1lID0gJVEAYmFkIEpTT04gcGF0aDogJVEAU0VUVVAAR1JPVVAAUkVDVVJTSVZFIFNURVAAU05hTgBRTmFOAG1hbGZvcm1lZCBKU09OAE5PIEFDVElPTgBPTUlUX0xPQURfRVhURU5TSU9OAFVOSU9OACBMRUZULUpPSU4AQkVHSU4ALGFyZyBISURERU4ALHNjaGVtYSBISURERU4AU0NBTgBERUZBVUxUX0FVVE9WQUNVVU0AIE5VTQBQTQBSVFJJTQBBTQBDYW5ub3QgYWRkIGEgTk9UIE5VTEwgY29sdW1uIHdpdGggZGVmYXVsdCB2YWx1ZSBOVUxMAE5PVCBOVUxMAFNFVCBOVUxMAFNFTEVDVCAxIEZST00gJVEuJyVxX3NlZ21lbnRzJyBXSEVSRSBibG9ja2lkPT8gQU5EIGJsb2NrIElTIE5VTEwAVU5JT04gQUxMACBSRUFMAENIRUNLAGFib3J0IGR1ZSB0byBST0xMQkFDSwBNQVRDSABTRUFSQ0gAVVNJTkcARU5BQkxFX05PUk1BTElaRQAgVU5JUVVFAERFTEVURQBVUERBVEUAJXUtUk9XIFZBTFVFUyBDTEFVU0UAUkVMRUFTRQBOT0NBU0UAQkVGT1JFAE5PTkUASWR4TEUAU2Vla0xFAFRBQkxFADE2TEUASWR4R0UAU2Vla0dFACVzIFVTSU5HIFRFTVAgQi1UUkVFAENBU0NBREUAMTZCRQBBTkQAUk9XSUQAT0lEAERJUkVDVF9PVkVSRkxPV19SRUFEAERFU0MAU0VMRUNUIGlkeCwgc3RhcnRfYmxvY2ssIGxlYXZlc19lbmRfYmxvY2ssIGVuZF9ibG9jaywgcm9vdCBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPyBPUkRFUiBCWSBpZHggQVNDAFNFTEVDVCBpZHgsIHN0YXJ0X2Jsb2NrLCBsZWF2ZXNfZW5kX2Jsb2NrLCBlbmRfYmxvY2ssIHJvb3QgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCBCRVRXRUVOID8gQU5EID9PUkRFUiBCWSBsZXZlbCBERVNDLCBpZHggQVNDAFNFTEVDVCBsZXZlbCwgaWR4LCBlbmRfYmxvY2sgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCBCRVRXRUVOID8gQU5EID8gT1JERVIgQlkgbGV2ZWwgREVTQywgaWR4IEFTQwBTRUxFQ1QgaWR4IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWw9PyBPUkRFUiBCWSAxIEFTQwBTWVNURU1fTUFMTE9DAEJMT0IAQkJCAEAAJXM6ICIlcyIgLSBzaG91bGQgdGhpcyBiZSBhIHN0cmluZyBsaXRlcmFsIGluIHNpbmdsZS1xdW90ZXM/AFVQREFURSBPUiBGQUlMICVRLiclcV9zZWdkaXInIFNFVCBsZXZlbD0tMSxpZHg9PyBXSEVSRSBsZXZlbD0/IEFORCBpZHg9PwBVUERBVEUgJVEuJyVxX3NlZ2RpcicgU0VUIGlkeCA9ID8gV0hFUkUgbGV2ZWw9PyBBTkQgaWR4PT8AJXM9PwBTRUxFQ1QgJXMgV0hFUkUgcm93aWQ9PwBTRUxFQ1Qgc2l6ZSBGUk9NICVRLiclcV9kb2NzaXplJyBXSEVSRSBkb2NpZD0/AFNFTEVDVCB2YWx1ZSBGUk9NICVRLiclcV9zdGF0JyBXSEVSRSBpZD0/AD8sPyw/AERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPwBTRUxFQ1QgbWF4KGxldmVsKSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnbWVudHMnIFdIRVJFIGJsb2NraWQgQkVUV0VFTiA/IEFORCA/AFVQREFURSAlUS4nJXFfc2VnZGlyJyBTRVQgc3RhcnRfYmxvY2sgPSA/LCByb290ID0gP1dIRVJFIGxldmVsID0gPyBBTkQgaWR4ID0gPwBTRUxFQ1QgaWR4LCBzdGFydF9ibG9jaywgbGVhdmVzX2VuZF9ibG9jaywgZW5kX2Jsb2NrLCByb290IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/IEFORCBpZHggPSA/AERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPyBBTkQgaWR4ID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCA9ID8AU0VMRUNUIGNvdW50KCopIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/AFNFTEVDVCAlcyBXSEVSRSByb3dpZCA9ID8AREVMRVRFIEZST00gJVEuJyVxX2NvbnRlbnQnIFdIRVJFIHJvd2lkID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfZG9jc2l6ZScgV0hFUkUgZG9jaWQgPSA/ACwgPwA8ZXhwcj4APGI+ADxiPi4uLjwvYj4ALT4+AC0+AHNlcGFyYXRvcnM9AHRva2VuY2hhcnM9AGF1dG9tZXJnZT0APABJTlNFUlQgSU5UTyAlUS5zcWxpdGVfbWFzdGVyIFZBTFVFUygnaW5kZXgnLCVRLCVRLCMlZCwlUSk7AENSRUFURSBUQUJMRSAlUS4nJXFfc2VnbWVudHMnKGJsb2NraWQgSU5URUdFUiBQUklNQVJZIEtFWSwgYmxvY2sgQkxPQik7AENSRUFURSBUQUJMRSAlUS4nJXFfZG9jc2l6ZScoZG9jaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgc2l6ZSBCTE9CKTsAQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJVEuJyVxX3N0YXQnKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIHZhbHVlIEJMT0IpOwBDUkVBVEUgVEFCTEUgJVEuJyVxX3NlZ2RpcicobGV2ZWwgSU5URUdFUixpZHggSU5URUdFUixzdGFydF9ibG9jayBJTlRFR0VSLGxlYXZlc19lbmRfYmxvY2sgSU5URUdFUixlbmRfYmxvY2sgSU5URUdFUixyb290IEJMT0IsUFJJTUFSWSBLRVkobGV2ZWwsIGlkeCkpOwBVUERBVEUgJVEuc3FsaXRlX21hc3RlciBTRVQgdGJsX25hbWUgPSAlUSwgbmFtZSA9IENBU0UgV0hFTiB0eXBlPSd0YWJsZScgVEhFTiAlUSBXSEVOIG5hbWUgTElLRSAnc3FsaXRlWF9hdXRvaW5kZXglJScgRVNDQVBFICdYJyAgICAgIEFORCB0eXBlPSdpbmRleCcgVEhFTiAnc3FsaXRlX2F1dG9pbmRleF8nIHx8ICVRIHx8IHN1YnN0cihuYW1lLCVkKzE4KSBFTFNFIG5hbWUgRU5EIFdIRVJFIHRibF9uYW1lPSVRIENPTExBVEUgbm9jYXNlIEFORCAodHlwZT0ndGFibGUnIE9SIHR5cGU9J2luZGV4JyBPUiB0eXBlPSd0cmlnZ2VyJyk7AERST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9zZWdtZW50cyc7RFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX3NlZ2Rpcic7RFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX2RvY3NpemUnO0RST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9zdGF0JzslcyBEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfY29udGVudCc7AEFMVEVSIFRBQkxFICVRLiclcV9jb250ZW50JyAgUkVOQU1FIFRPICclcV9jb250ZW50JzsAQUxURVIgVEFCTEUgJVEuJyVxX3N0YXQnICBSRU5BTUUgVE8gJyVxX3N0YXQnOwBBTFRFUiBUQUJMRSAlUS4nJXFfc2VnbWVudHMnIFJFTkFNRSBUTyAnJXFfc2VnbWVudHMnOwBBTFRFUiBUQUJMRSAlUS4nJXFfc2VnZGlyJyAgIFJFTkFNRSBUTyAnJXFfc2VnZGlyJzsAQUxURVIgVEFCTEUgJVEuJyVxX2RvY3NpemUnICBSRU5BTUUgVE8gJyVxX2RvY3NpemUnOwA6bWVtb3J5OgBmaWxlOgAtOWU5OTkAOS4wZTk5OQArLSAKCTAxMjM0NTY3ODkAXHUwMDA5AFN0cmluZzgAdXRmOABVVEY4AFVURi04AERFRkFVTFRfU0VDVE9SX1NJWkU9NDA5NgBERUZBVUxUX1BBR0VfU0laRT00MDk2AE1BWF9WQVJJQUJMRV9OVU1CRVI9MzI3NjYATUFYX1BBR0VfU0laRT02NTUzNgBVVEYxNgBVVEYtMTYAcDUAdG9vIG1hbnkgcmVmZXJlbmNlcyB0byAiJXMiOiBtYXggNjU1MzUARkxBR1MgcGFyYW1ldGVyIHRvIGpzb25fdmFsaWQoKSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTUAc3FsaXRlX3N0YXQ0AGZ0czQAcDQAREVGQVVMVF9GSUxFX0ZPUk1BVD00AEludDY0AHB3cml0ZTY0AHByZWFkNjQATUFMTE9DX1NPRlRfTElNSVQ9MTAyNABzcWxpdGVfc3RhdDMAU0FWRVBPSU5UIGZ0czMAUk9MTEJBQ0sgVE8gZnRzMwBSRUxFQVNFIGZ0czMAcDMARU5BQkxFX0ZUUzMAcDIAYXRuMgBhdGFuMgByZW1vdmVfZGlhY3JpdGljcz0yAERFRkFVTFRfU1lOQ0hST05PVVM9MgBERUZBVUxUX1dBTF9TWU5DSFJPTk9VUz0yAGFyZ2M9PTMgfHxhcmdjPT0yAE1BWF9ERUZBVUxUX1BBR0VfU0laRT04MTkyAFNFTEVDVCB0YmwsaWR4LHN0YXQgRlJPTSAlUS5zcWxpdGVfc3RhdDEAQWdnU3RlcDEAcmVtb3ZlX2RpYWNyaXRpY3M9MQBBVE9NSUNfSU5UUklOU0lDUz0xAFRFTVBfU1RPUkU9MQBhcmdjPT0xAHVuaWNvZGU2MQBVUERBVEUgT1IgRkFJTCAlUS4nJXFfc2VnZGlyJyBTRVQgbGV2ZWw9PyBXSEVSRSBsZXZlbD0tMQBERUZBVUxUX0pPVVJOQUxfU0laRV9MSU1JVD0tMQBTRUxFQ1QgbGV2ZWwsIGNvdW50KCopIEFTIGNudCBGUk9NICVRLiclcV9zZWdkaXInICAgR1JPVVAgQlkgbGV2ZWwgSEFWSU5HIGNudD49PyAgT1JERVIgQlkgKGxldmVsICUlIDEwMjQpIEFTQywgMiBERVNDIExJTUlUIDEAU0VMRUNUIChTRUxFQ1QgbWF4KGlkeCkgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCA9ID8pICsgMQBTRUxFQ1QnSU5TRVJUIElOVE8gJXMuJ3x8cXVvdGUobmFtZSl8fCcgU0VMRUNUKkZST00iJXciLid8fHF1b3RlKG5hbWUpRlJPTSAlcy5zcWxpdGVfc2NoZW1hIFdIRVJFIHR5cGU9J3RhYmxlJ0FORCBjb2FsZXNjZShyb290cGFnZSwxKT4wAFNFTEVDVCBzcWwgRlJPTSAiJXciLnNxbGl0ZV9zY2hlbWEgV0hFUkUgdHlwZT0ndGFibGUnQU5EIG5hbWU8PidzcWxpdGVfc2VxdWVuY2UnIEFORCBjb2FsZXNjZShyb290cGFnZSwxKT4wAHJlbW92ZV9kaWFjcml0aWNzPTAATUFYX1dPUktFUl9USFJFQURTPTAAREVGQVVMVF9XT1JLRVJfVEhSRUFEUz0wAE1BWF9NTUFQX1NJWkU9MABERUZBVUxUX01NQVBfU0laRT0wAFRIUkVBRFNBRkU9MAA5MjIzMzcyMDM2ODU0Nzc1ODAAMjAyNS0wMi0xOCAxMzozODo1OCA4NzNkNGUyNzRiNDk4OGQyNjBiYTgzNTRhOTcxODMyNGExYzI2MTg3YTRhYjRjMWNjMDIyN2MwM2QwZjEwZTcwAERFRkFVTFRfUENBQ0hFX0lOSVRTWj0yMABsb2cxMABNQVhfQVRUQUNIRUQ9MTAAXHUwMABNQVhfQ09NUE9VTkRfU0VMRUNUPTUwMAA/MDAwAE1BWF9DT0xVTU49MjAwMABERUZBVUxUX0NBQ0hFX1NJWkU9LTIwMDAAREVGQVVMVF9XQUxfQVVUT0NIRUNLUE9JTlQ9MTAwMABNQVhfRVhQUl9ERVBUSD0xMDAwAE1BWF9UUklHR0VSX0RFUFRIPTEwMDAATUFYX0ZVTkNUSU9OX0FSRz0xMDAwAFx1MDAwMABNQVhfTElLRV9QQVRURVJOX0xFTkdUSD01MDAwMABNQVhfVkRCRV9PUD0yNTAwMDAwMDAATUFYX0xFTkdUSD0xMDAwMDAwMDAwAE1BWF9TUUxfTEVOR1RIPTEwMDAwMDAwMDAAc2Vjb25kIGFyZ3VtZW50IHRvICUjVCgpIG11c3QgYmUgYSBjb25zdGFudCBiZXR3ZWVuIDAuMCBhbmQgMS4wAENPTVBJTEVSPWNsYW5nLTIxLjAuMAAvcHJvYy9zZWxmL2ZkLwAlUS4ATi4ALS0ALABub3NraXBzY2FuKgB1bm9yZGVyZWQqAHN6PVswLTldKgAoc3VicXVlcnktJXUpAChqb2luLSV1KQBCYWQgcHRyIG1hcCBlbnRyeSBrZXk9JXUgZXhwZWN0ZWQ9KCV1LCV1KSBnb3Q9KCV1LCV1KQBtYXggcm9vdHBhZ2UgKCV1KSBkaXNhZ3JlZXMgd2l0aCBoZWFkZXIgKCV1KQBDUkVBVEUgVEFCTEUgeCh0eXBlIHRleHQsbmFtZSB0ZXh0LHRibF9uYW1lIHRleHQscm9vdHBhZ2UgaW50LHNxbCB0ZXh0KQBDUkVBVEUgVEFCTEUgJVEuJXMoJXMpAGF1dG9tYXRpYyBpbmRleCBvbiAlcyglcykAQU5ZKCVzKQBJTlNFUlQgSU5UTyAlUS4nJXFfY29udGVudCcgVkFMVUVTKCVzKQBDUkVBVEUgVEFCTEUgJVEuJyVxX2NvbnRlbnQnKCVzKQBtYWxmb3JtZWQgZGF0YWJhc2Ugc2NoZW1hICglcykATUVSR0UgKCVzKQBDUkVBVEUgVEFCTEUgJVEuc3FsaXRlX3NlcXVlbmNlKG5hbWUsc2VxKQBDUkVBVEUgVEFCTEUgeChpbnB1dCwgdG9rZW4sIHN0YXJ0LCBlbmQsIHBvc2l0aW9uKQBVUERBVEUgIiV3Ii5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfZHJvcF9jb2x1bW4oJWQsIHNxbCwgJWQpIFdIRVJFICh0eXBlPT0ndGFibGUnIEFORCB0YmxfbmFtZT0lUSBDT0xMQVRFIG5vY2FzZSkAbWVtZGIoJXAsJWxsZCkAJXMoJWQpAHplcm9ibG9iKCVkKQBGVFMgZXhwcmVzc2lvbiB0cmVlIGlzIHRvbyBsYXJnZSAobWF4aW11bSBkZXB0aCAlZCkARXhwcmVzc2lvbiB0cmVlIGlzIHRvbyBsYXJnZSAobWF4aW11bSBkZXB0aCAlZCkAKGJsb2IpAFVTRSBURU1QIEItVFJFRSBGT1IgJXMoT1JERVIgQlkpAFVTRSBURU1QIEItVFJFRSBGT1IgJXMoRElTVElOQ1QpAFVQREFURSAiJXciLnNxbGl0ZV9tYXN0ZXIgU0VUIHNxbCA9IHNxbGl0ZV9yZW5hbWVfY29sdW1uKHNxbCwgdHlwZSwgbmFtZSwgJVEsICVRLCAlZCwgJVEsICVkLCAlZCkgV0hFUkUgbmFtZSBOT1QgTElLRSAnc3FsaXRlWF8lJScgRVNDQVBFICdYJyAgQU