UNPKG

ome-zarr.js

Version:

Some JavaScript utils for simple rendering of OME-Zarr images

1 lines 193 kB
(function(E,S){typeof exports=="object"&&typeof module<"u"?S(exports,require("zarrita")):typeof define=="function"&&define.amd?define(["exports","zarrita"],S):(E=typeof globalThis<"u"?globalThis:E||self,S(E["ome-zarr"]={},E.zarr))})(this,(function(E,S){"use strict";var M5=Object.defineProperty;var x5=(E,S,B)=>S in E?M5(E,S,{enumerable:!0,configurable:!0,writable:!0,value:B}):E[S]=B;var k=(E,S,B)=>x5(E,typeof S!="symbol"?S+"":S,B);function B(l){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(l){for(const n in l)if(n!=="default"){const e=Object.getOwnPropertyDescriptor(l,n);Object.defineProperty(a,n,e.get?e:{enumerable:!0,get:()=>l[n]})}}return a.default=l,Object.freeze(a)}function r5(l,a){for(var n=0;n<a.length;n++){const e=a[n];if(typeof e!="string"&&!Array.isArray(e)){for(const r in e)if(r!=="default"&&!(r in l)){const o=Object.getOwnPropertyDescriptor(e,r);o&&Object.defineProperty(l,r,o.get?o:{enumerable:!0,get:()=>e[r]})}}}return Object.freeze(Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}))}const M=B(S);function H(l,a,n){const{dst:e,blending:r="additive"}=n??{},[o,t]=l.shape,i=e??new Uint8ClampedArray(4*o*t).fill(0),s=o*t*4;let h=0;for(let f=0;f<s;f+=4){const u=Number(l.data[h]);h+=1;const[c,p,_,y=255]=a(u),m=i[f+3]/255,g=(y??255)/255;if(r==="additive")i[f]=Math.min(i[f]*m+c,255),i[f+1]=Math.min(i[f+1]*m+p,255),i[f+2]=Math.min(i[f+2]*m+_,255),i[f+3]=Math.min(m+g,1)*255;else if(r==="translucent")i[f]=c*g+i[f]*m*(1-g),i[f+1]=p*g+i[f+1]*m*(1-g),i[f+2]=_*g+i[f+2]*m*(1-g),i[f+3]=(g+m*(1-g))*255;else throw new Error("Invalid blending mode")}return i}function q(l,a,n){const e=a.length,{dst:r,blending:o="additive"}=n??{};let t;if(n!=null&&n.range){const i=n.range;t=function(s){const[h,f]=i;return s<h&&(s=h),s>f&&(s=f),s=Math.round((e-1)*(s-h)/(f-h)),a[s]}}else t=function(i){if(i<=0)return a[0];const s=(i-1)%(e-1)+1;return a[s]};return H(l,t,{dst:r,blending:o})}function j(l,a,n){const{dst:e,blending:r="additive",fillValue:o=[0,0,0,0]}=n??{};function t(i){return a.get(i)??o}return H(l,t,{dst:e,blending:r})}async function p1(l,a,n,e,r,o){const{signal:t,calcMinMaxForRange:i}=o??{};t==null||t.throwIfAborted();let s=l.shape,h=(a==null?void 0:a.map(T=>T.name||T.toString()))||["t","c","z","y","x"],f=h.indexOf("c"),u=s[f]||1,c,p,_=[],y;if(n){let T=0;c=n.map(A=>(A.active==null&&(A.active=!0),T+=A.active?1:0,A.active&&T<=F)),p=n.map(A=>y1(A.color)),_=n.map(A=>"lut"in A&&A.lut?A.lut:"colorMap"in A?A.colorMap:void 0)}else c=b1(u),p=f5(u,c);let m=c.reduce((T,A,v)=>(A&&T.push(v),T),[]);p=m.map(T=>p[T]),y=m.map(T=>{var A;return!!((A=n==null?void 0:n[T])!=null&&A.inverted)}),_!==void 0&&(_=_.filter((T,A)=>m.includes(A)));let d=C1(m,s,h,e).map(T=>M.get(l,T,{opts:{signal:t}})),b=await Promise.all(d);t==null||t.throwIfAborted();let w=m.map((T,A)=>{var v,P;if(n&&n[T]){let C=n[T];if(((v=C==null?void 0:C.window)==null?void 0:v.start)!==void 0&&((P=C==null?void 0:C.window)==null?void 0:P.end)!==void 0)return[C.window.start,C.window.end]}if(i)return E1(b[A])}),R=_1(b,w,p,_,y,r);const L=b[0].shape[0],O=b[0].shape[1];return{data:R,width:O,height:L}}function _1(l,a,n,e,r,o=!1){let t=n.map((h,f)=>{let u=e!=null&&e.length?e[f]:void 0;return u||(u=Array.from({length:256},(c,p)=>[h[0]*p/255,h[1]*p/255,h[2]*p/255,255])),r&&r[f]&&Array.isArray(u)&&(u=u.reverse()),u}),i=performance.now(),s;if(t[0]instanceof Map){let h=t[0],f=h.get(g1);s=j(l[0],h,{fillValue:f})}else s=q(l[0],t[0],{range:a[0]});for(let h=1;h<l.length;h++)if(t[h]instanceof Map){let f=t[h],u=f.get(1/0);s=j(l[h],f,{blending:"additive",dst:s,fillValue:u})}else s=q(l[h],t[h],{blending:"additive",dst:s,range:a[h]});if(performance.now()-i<100&&o){let h=5;c5(s,h)[h-1]<1&&(s=u5(s,2))}return s}function i5(l,a){return l+(l.endsWith("/")?"":"/")+"|zarr"+a+":"}function n5(l){return l.split("/").filter(Boolean).pop()||"Default"}function a5(l,a,n,e,r){var f;const o={};e.forEach((u,c)=>{o[u.name]={...u,index:c}});let t="4panel-alt";if("z"in o){const u=o.z.index;r[u]===1&&(t="xy")}else t="xy";const i=n==="segmentation"&&(!o.c||r[(f=o.c)==null?void 0:f.index]===1)?"segmentation":"auto",s={layers:[{name:n5(l),source:i5(l,a),type:i}],layout:t},h=JSON.stringify(s);return encodeURIComponent(h)}class N{constructor(a,n){k(this,"attrs");k(this,"imgAttrs");k(this,"store");k(this,"multiscales");k(this,"paths");k(this,"scales");k(this,"shapes");k(this,"arrays",{});k(this,"omero");k(this,"axes");k(this,"zarr_version");k(this,"omezarr_version");var e,r;this.store=n,"ome"in a?(this.attrs=a,this.imgAttrs=JSON.parse(JSON.stringify(this.attrs.ome)),this.zarr_version=3,this.omezarr_version=this.imgAttrs.version,this.axes=this.imgAttrs.multiscales[0].axes,!this.axes&&((r=(e=this.imgAttrs.multiscales[0].coordinateSystems)==null?void 0:e[0])!=null&&r.axes)&&(this.axes=this.imgAttrs.multiscales[0].coordinateSystems[0].axes)):(this.attrs=a,this.imgAttrs=JSON.parse(JSON.stringify(this.attrs)),this.zarr_version=2,this.omezarr_version=this.imgAttrs.multiscales[0].version||"0.4",this.axes=this.imgAttrs.multiscales[0].axes||["t","c","z","y","x"].map(o=>({name:o}))),this.multiscales=this.imgAttrs.multiscales,this.omero=this.imgAttrs.omero,this.calcMinMaxForRange=!0,this.paths=this.multiscales[0].datasets.map(o=>o.path),this.scales=this.getScales()}static async load(a,n={}){const{signal:e}=n??{};e==null||e.throwIfAborted(),typeof a=="string"&&(a=new M.FetchStore(a));let r;if(n.attrs)r=n.attrs;else{let i;a instanceof M.Group?i=a:(i=await W(a,void 0,void 0,{signal:e}),e==null||e.throwIfAborted()),r=i.attrs}const o=new this(r,a),t=n.datasetIndex??0;return await o.openArray(t),o}checkChannelIndex(a){if(!this.omero)throw new Error("No Omero metadata found in image");if(a<0||a>=this.omero.channels.length)throw new Error(`Invalid channel index: ${a} for image with ${this.omero.channels.length} channels`);return this.omero}setChannelActive(a,n){let e=this.checkChannelIndex(a);e.channels[a].active=n}setChannelColor(a,n){let e=this.checkChannelIndex(a);e.channels[a].color=n}setChannelStart(a,n){let e=this.checkChannelIndex(a);e.channels[a].window.start=n}setChannelEnd(a,n){let e=this.checkChannelIndex(a);e.channels[a].window.end=n}setChannelInverted(a,n){let e=this.checkChannelIndex(a);e.channels[a].inverted=n}setChannelLut(a,n){let e=this.checkChannelIndex(a);n==null?delete e.channels[a].lut:e.channels[a].lut=n}setChannelColorMap(a,n){let e=this.checkChannelIndex(a);e.channels[a].colorMap=n}setZIndex(a){if(!this.omero)throw new Error("No Omero metadata found in image");this.omero.rdefs.defaultZ=a}setTIndex(a){if(!this.omero)throw new Error("No Omero metadata found in image");this.omero.rdefs.defaultT=a}async getShape(a=0){return(await this.openArray(a)).shape}getAxesNames(){return this.axes.map(a=>a.name||a.toString())}getVersion(){return this.omezarr_version}getZarrVersion(){return this.zarr_version}async getLabelsPaths(){var n;let a=[];try{let e=await W(this.store,"labels",this.zarr_version);e&&((n=e.attrs)!=null&&n.labels)&&(a=e.attrs.labels)}catch(e){console.info("Failed to load labels group:",e)}return a}async getNeuroglancerUrl(){const a="https://neuroglancer-demo.appspot.com/#!";let n=this.store.url||"";if(!n)throw new Error("Cannot generate Neuroglancer URL: store does not have a URL");let e=this.getZarrVersion(),r=this.imgAttrs["image-label"]?"segmentation":"auto",o=await this.getShape();return a+a5(n.toString(),e,r,this.axes,o)}async openArray(a,n){let e;if(typeof a=="number"?(a<0&&(a=this.paths.length+a),e=this.paths[a]):e=a,this.arrays[e])return this.arrays[e];let r=await V(this.store,e,this.zarr_version,n);if(this.arrays[e]=r,!this.omero){let o=await this.calcShapes(),t=(o==null?void 0:o[0])||r.shape,i=this.axes.map(u=>u.name||u.toString()),s=t[i.findIndex(u=>u==="c")]||1,h=t[i.findIndex(u=>u==="z")]||1,f=t[i.findIndex(u=>u==="t")]||1;if(this.omero=h5({sizeC:s,sizeZ:h,sizeT:f},r.dtype),i.includes("z")){let u=t[i.findIndex(c=>c==="z")]||1;this.omero.rdefs.defaultZ=Math.floor(u/2)}}return r}async calcShapes(a){if(this.shapes!==void 0)return this.shapes;if(a===void 0){for(let i=0;i<this.paths.length;i++)if(this.arrays[this.paths[i]]){a=i;break}}a===void 0&&(a=0);const e=(await this.openArray(a)).shape,r=this.scales,o=r[a],t=r.map(i=>e.map((s,h)=>Math.floor(s*o[h]/i[h])));return this.shapes=t,t}getScales(){const a=this.multiscales[0].datasets.map(n=>{let e;if(Array.isArray(n.coordinateTransformations)){for(const r of n.coordinateTransformations)if("scale"in r){e=r.scale;break}else if("transformations"in r){for(const o of r.transformations)if("scale"in o){e=o.scale;break}}}return e}).filter(n=>n!==void 0);if(a.length>0&&a.length!==this.multiscales[0].datasets.length)throw new Error("Could not determine scales for all datasets");return a}async getPathForTargetSize(a,n){let e=[];if(n==null){n=0;for(let t=0;t<this.paths.length;t++)if(this.arrays[this.paths[t]]){n=t;break}}if(this.scales.length==0){let i=(await this.openArray(n)).shape,s=i.length,h=i[s-1],f=i[s-2],u=Math.max(h,f);e=this.paths.map((c,p)=>u*2**(n-p))}else{let t=await this.calcShapes(),i=t[0].length;e=t.map(s=>Math.max(s[i-1],s[i-2]))}let r;for(r=0;r<e.length;r++){let t=e[r],i=e[r+1];if(i){if(i>a)continue;{let s=(t+i)/2;a<s&&(r+=1);break}}else break}return this.paths[r]}async renderArray(a={}){var y,m,g,d,b;let n;if(a.arr)if(typeof a.arr=="string"){const w=new M.FetchStore(a.arr);n=await M.open(w,{kind:"array"})}else n=a.arr;else{let w;if(a.arrayPathOrIndex!==void 0)w=a.arrayPathOrIndex;else if(a.targetSize!==void 0)w=await this.getPathForTargetSize(a.targetSize);else throw new Error("Need to specify arr OR targetSize OR arrayPathOrIndex ");n=await this.openArray(w)}let e=a.maxSize??1e3,r=n.shape,o=r.length,t=r[o-1],i=r[o-2];if(i*t>e*e&&!a.slices)throw new Error(`Array size (${t} * ${i}) is larger than specified 'maxSize' of ${e} * ${e}`);let s=a.slices||{};s.z==null&&(s.z=(m=(y=this.omero)==null?void 0:y.rdefs)==null?void 0:m.defaultZ);let h=this.getAxesNames().indexOf("z");if(h!=-1&&Number.isInteger(s.z)){const w=await this.getShape();w&&w[h]!=r[h]&&(s.z=Math.floor(s.z*r[h]/w[h]))}s.t==null&&(s.t=(d=(g=this.omero)==null?void 0:g.rdefs)==null?void 0:d.defaultT);let f=a.channels||((b=this.omero)==null?void 0:b.channels),u=this.calcMinMaxForRange??!0;(a==null?void 0:a.calcMinMaxForRange)!=null&&(u=a.calcMinMaxForRange);let{data:c,width:p,height:_}=await p1(n,this.axes,f,s,!!a.autoBoost,{signal:a.signal,calcMinMaxForRange:!!u});return{data:c,width:p,height:_}}async render(a={}){let{data:n,width:e}=await this.renderArray(a);return Z(n,e)}}class s5 extends N{constructor(a,n){super(a,n),this.calcMinMaxForRange=!1}static async load(a,n={}){let e=await super.load(a,n);if(e.omero&&e.omero.channels)for(let r of e.omero.channels)console.log("BEFORE",r.window),r.window&&(delete r.window.start,delete r.window.end);return e}}const F=3,x={cyan:"#00FFFF",yellow:"#FFFF00",magenta:"#FF00FF",red:"#FF0000",green:"#00FF00",blue:"#0000FF",white:"#FFFFFF"},l5=[x.magenta,x.green],o5=[x.red,x.green,x.blue],m1=Object.values(x),g1=1/0;function y1(l){l.startsWith("#")&&(l=l.slice(1));const a=parseInt(l.slice(0,2),16),n=parseInt(l.slice(2,4),16),e=parseInt(l.slice(4,6),16);return[a,n,e]}function b1(l){let a;return l<=F?a=Array(l).fill(!0):a=[...Array(F).fill(!0),...Array(l-F).fill(!1)],a}function h5({sizeC:l,sizeZ:a,sizeT:n},e){let r=b1(l),o=w1(l,r),t=A1(e),i=r.map((h,f)=>({active:h,color:o[f],window:{min:t.min,max:t.max}})),s={defaultT:n!==void 0?Math.floor(n/2):0,defaultZ:a!==void 0?Math.floor(a/2):0,model:"color"};return{channels:i,rdefs:s}}function w1(l,a){let n=[];if(l==1)n=[x.white];else if(l==2)n=l5;else if(l===3)n=o5;else if(l<=F)n=m1.slice(0,l);else{n=Array(l).fill(x.white);const e=a.flatMap((r,o)=>r?o:[]);for(const[r,o]of e.entries())n[o]=m1[r]}return n=n.map(e=>(e.startsWith("#")&&(e=e.slice(1)),e)),n}function f5(l,a){return w1(l,a).map(y1)}function E1(l){const a=l.data;let n=0,e=1/0,r=l.data.length;for(let o=0;o<r;o++){let t=Number(a[o]);n=Math.max(n,t),e=Math.min(e,t)}return[e,n]}function A1(l){let a=0,n=65535;if(l)if(l.includes("int")||l.includes("uint")){const e=l.match(/\d+/);if(e){const r=parseInt(e[0]);l.startsWith("u")?(a=0,n=2**r-1):(a=-(2**(r-1)),n=2**(r-1)-1)}else{const r=l.match(/^[<>|]([iuf])(\d+)$/);if(r){const o=r[1],i=parseInt(r[2],10)*8;o==="i"?(a=-(2**(i-1)),n=2**(i-1)-1):o==="u"&&(a=0,n=2**i-1)}else console.warn("Could not determine min/max values for dtype: ",l)}}else console.warn("Unrecognized dtype format: ",l);return{min:a,max:n}}function u5(l,a){for(let n=0;n<l.length/4;n++)for(let e=0;e<3;e++){let r=l[n*4+e];r=Math.min(255,r*a),l[n*4+e]=r}return l}function c5(l,a=5){let n=new Array(a).fill(0);const e=256/a;let r=l.length/4;for(let o=0;o<r;o++){let t=l[o*4];t=Math.max(l[o*4+1],t),t=Math.max(l[o*4+2],t);let i=Math.floor(t/e);n[i]+=1}return n=n.map(o=>100*o/r),n}async function d5(l,a){const n=await N.load(l,a);return{multiscale:n.multiscales[0],omero:n.omero,zarr_version:n.zarr_version}}async function p5(l,a=0,n){const e=await N.load(l,n),r=e.multiscales[0],o=e.omero,t=e.zarr_version,i=e.scales,s=await e.openArray(a,n);let h=await e.calcShapes();return h.length==0&&(h=void 0),{arr:s,shapes:h,multiscale:r,omero:o,scales:i,zarr_version:t}}async function T1(l,a,n,e,r){const{signal:o}=r??{};o==null||o.throwIfAborted();const t=e===3?M.open.v3:e===2?M.open.v2:M.open;let i;if(l instanceof M.Group)i=l;else{const h=typeof l=="string"?new M.FetchStore(l):l;i=M.root(h)}n&&(i=i.resolve(n));const s=await t(i,{kind:a});return o==null||o.throwIfAborted(),s}async function _5(l,a,n,e){console.warn("getArray is deprecated and will be removed in future versions. Please use openArray() instead.");const{signal:r}=e??{};return V(l,a,n,{signal:r})}async function V(l,a,n,e){const{signal:r}=e??{};return r==null||r.throwIfAborted(),T1(l,"array",a,n,{signal:r})}async function W(l,a,n,e){const{signal:r}=e??{};return r==null||r.throwIfAborted(),T1(l,"group",a,n,{signal:r})}function C1(l,a,n,e){return l.map(o=>a.map((i,s)=>{let h=n[s];if(h=="c")return o;if(h in e){let f=e[h];if(Array.isArray(f))return S.slice(f[0],f[1]);if(Number.isInteger(f))return f!==void 0?f:void 0}return h=="x"||h=="y"?S.slice(0,i):h=="z"||h=="t"?parseInt(i/2+""):0}))}async function Z(l,a){let n=l.length/(a*4);if(typeof document<"u"){const e=document.createElement("canvas");e.width=a,e.height=n;const r=e.getContext("2d");return r?(r.putImageData(new ImageData(l,a,n),0,0),e.toDataURL("image/png")):""}else{const{PNG:e}=await Promise.resolve().then(()=>P5),{Buffer:r}=await Promise.resolve().then(()=>A2),o=new e({width:a,height:n});o.data=r.from(l.buffer,l.byteOffset,l.byteLength);const t=[],i=o.pack();return new Promise((s,h)=>{i.on("data",f=>t.push(f)),i.on("end",()=>{s(`data:image/png;base64,${r.concat(t).toString("base64")}`)}),i.on("error",h)})}}function R1(){return z.map(l=>({name:l.name,png:I1(l.rgb)}))}function O1(l){let a=z.find(n=>n.name===l);return(a==null?void 0:a.rgb)||z[0].rgb}function I1(l){let a=1,n=256,e=new Uint8ClampedArray(4*a*n).fill(255),r=0;for(let s=0;s<a;s++)for(let h=0;h<n;h++){let f=l[h];for(let u=0;u<3;u++)e[r*4+u]=f[u];r+=1}const o=document.createElement("canvas");o.width=n,o.height=a;const t=o.getContext("2d");return t?(t.putImageData(new ImageData(e,n,a),0,0),o.toDataURL("image/png")):""}const S1=[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,171],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[1,1,224],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[0,110,255],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,171,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,224,254],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[1,254,1],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[190,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,224,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[255,141,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[250,94,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,0],[245,0,135],[245,0,141],[245,0,147],[245,0,153],[245,0,160],[245,0,166],[245,0,172],[245,0,178],[245,0,185],[245,0,191],[245,0,197],[245,0,203],[245,0,210],[245,0,216],[245,0,222],[245,0,228],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[222,180,222],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255]],v1=[[0,0,0],[0,0,64],[0,0,128],[0,0,192],[0,32,0],[0,32,64],[0,32,128],[0,32,192],[0,64,0],[0,64,64],[0,64,128],[0,64,192],[0,96,0],[0,96,64],[0,96,128],[0,96,192],[0,128,0],[0,128,64],[0,128,128],[0,128,192],[0,160,0],[0,160,64],[0,160,128],[0,160,192],[0,192,0],[0,192,64],[0,192,128],[0,192,192],[0,224,0],[0,224,64],[0,224,128],[0,224,192],[32,0,0],[32,0,64],[32,0,128],[32,0,192],[32,32,0],[32,32,64],[32,32,128],[32,32,192],[32,64,0],[32,64,64],[32,64,128],[32,64,192],[32,96,0],[32,96,64],[32,96,128],[32,96,192],[32,128,0],[32,128,64],[32,128,128],[32,128,192],[32,160,0],[32,160,64],[32,160,128],[32,160,192],[32,192,0],[32,192,64],[32,192,128],[32,192,192],[32,224,0],[32,224,64],[32,224,128],[32,224,192],[64,0,0],[64,0,64],[64,0,128],[64,0,192],[64,32,0],[64,32,64],[64,32,128],[64,32,192],[64,64,0],[64,64,64],[64,64,128],[64,64,192],[64,96,0],[64,96,64],[64,96,128],[64,96,192],[64,128,0],[64,128,64],[64,128,128],[64,128,192],[64,160,0],[64,160,64],[64,160,128],[64,160,192],[64,192,0],[64,192,64],[64,192,128],[64,192,192],[64,224,0],[64,224,64],[64,224,128],[64,224,192],[96,0,0],[96,0,64],[96,0,128],[96,0,192],[96,32,0],[96,32,64],[96,32,128],[96,32,192],[96,64,0],[96,64,64],[96,64,128],[96,64,192],[96,96,0],[96,96,64],[96,96,128],[96,96,192],[96,128,0],[96,128,64],[96,128,128],[96,128,192],[96,160,0],[96,160,64],[96,160,128],[96,160,192],[96,192,0],[96,192,64],[96,192,128],[96,192,192],[96,224,0],[96,224,64],[96,224,128],[96,224,192],[128,0,0],[128,0,64],[128,0,128],[128,0,192],[128,32,0],[128,32,64],[128,32,128],[128,32,192],[128,64,0],[128,64,64],[128,64,128],[128,64,192],[128,96,0],[128,96,64],[128,96,128],[128,96,192],[128,128,0],[128,128,64],[128,128,128],[128,128,192],[128,160,0],[128,160,64],[128,160,128],[128,160,192],[128,192,0],[128,192,64],[128,192,128],[128,192,192],[128,224,0],[128,224,64],[128,224,128],[128,224,192],[160,0,0],[160,0,64],[160,0,128],[160,0,192],[160,32,0],[160,32,64],[160,32,128],[160,32,192],[160,64,0],[160,64,64],[160,64,128],[160,64,192],[160,96,0],[160,96,64],[160,96,128],[160,96,192],[160,128,0],[160,128,64],[160,128,128],[160,128,192],[160,160,0],[160,160,64],[160,160,128],[160,160,192],[160,192,0],[160,192,64],[160,192,128],[160,192,192],[160,224,0],[160,224,64],[160,224,128],[160,224,192],[192,0,0],[192,0,64],[192,0,128],[192,0,192],[192,32,0],[192,32,64],[192,32,128],[192,32,192],[192,64,0],[192,64,64],[192,64,128],[192,64,192],[192,96,0],[192,96,64],[192,96,128],[192,96,192],[192,128,0],[192,128,64],[192,128,128],[192,128,192],[192,160,0],[192,160,64],[192,160,128],[192,160,192],[192,192,0],[192,192,64],[192,192,128],[192,192,192],[192,224,0],[192,224,64],[192,224,128],[192,224,192],[224,0,0],[224,0,64],[224,0,128],[224,0,192],[224,32,0],[224,32,64],[224,32,128],[224,32,192],[224,64,0],[224,64,64],[224,64,128],[224,64,192],[224,96,0],[224,96,64],[224,96,128],[224,96,192],[224,128,0],[224,128,64],[224,128,128],[224,128,192],[224,160,0],[224,160,64],[224,160,128],[224,160,192],[224,192,0],[224,192,64],[224,192,128],[224,192,192],[224,224,0],[224,224,64],[224,224,128],[224,224,192]],L1=[[0,0,1],[0,0,5],[0,0,10],[0,0,15],[0,0,20],[0,0,25],[0,0,30],[0,0,35],[0,0,40],[0,0,45],[0,0,50],[0,0,55],[0,0,60],[0,0,65],[0,0,70],[0,0,75],[0,0,80],[0,0,85],[0,0,90],[0,0,95],[0,0,100],[0,0,105],[0,0,110],[0,0,115],[0,0,120],[0,0,125],[0,0,130],[0,0,135],[0,0,140],[0,0,145],[0,0,150],[0,0,155],[0,0,160],[0,0,165],[0,0,170],[0,0,175],[0,0,180],[0,0,185],[0,0,190],[0,0,195],[0,0,200],[0,0,205],[0,0,210],[0,0,215],[0,0,220],[0,0,225],[0,0,230],[0,0,235],[0,0,240],[0,0,245],[0,0,250],[0,1,0],[0,5,0],[0,10,0],[0,15,0],[0,20,0],[0,25,0],[0,30,0],[0,35,0],[0,40,0],[0,45,0],[0,50,0],[0,55,0],[0,60,0],[0,65,0],[0,70,0],[0,75,0],[0,80,0],[0,85,0],[0,90,0],[0,95,0],[0,100,0],[0,105,0],[0,110,0],[0,115,0],[0,120,0],[0,125,0],[0,130,0],[0,135,0],[0,140,0],[0,145,0],[0,150,0],[0,155,0],[0,160,0],[0,165,0],[0,170,0],[0,175,0],[0,180,0],[0,185,0],[0,190,0],[0,195,0],[0,200,0],[0,205,0],[0,210,0],[0,215,0],[0,220,0],[0,225,0],[0,230,0],[0,235,0],[0,240,0],[0,245,0],[0,250,0],[1,1,0],[5,5,0],[10,10,0],[15,15,0],[20,20,0],[25,25,0],[30,30,0],[35,35,0],[40,40,0],[45,45,0],[50,50,0],[55,55,0],[60,60,0],[65,65,0],[70,70,0],[75,75,0],[80,80,0],[85,85,0],[90,90,0],[95,95,0],[100,100,0],[105,105,0],[110,110,0],[115,115,0],[120,120,0],[125,125,0],[130,130,0],[135,135,0],[140,140,0],[145,145,0],[150,150,0],[155,155,0],[160,160,0],[165,165,0],[170,170,0],[175,175,0],[180,180,0],[185,185,0],[190,190,0],[195,195,0],[200,200,0],[205,205,0],[210,210,0],[215,215,0],[220,220,0],[225,225,0],[230,230,0],[235,235,0],[240,240,0],[245,245,0],[250,250,0],[1,0,0],[5,0,0],[10,0,0],[15,0,0],[20,0,0],[25,0,0],[30,0,0],[35,0,0],[40,0,0],[45,0,0],[50,0,0],[55,0,0],[60,0,0],[65,0,0],[70,0,0],[75,0,0],[80,0,0],[85,0,0],[90,0,0],[95,0,0],[100,0,0],[105,0,0],[110,0,0],[115,0,0],[120,0,0],[125,0,0],[130,0,0],[135,0,0],[140,0,0],[145,0,0],[150,0,0],[155,0,0],[160,0,0],[165,0,0],[170,0,0],[175,0,0],[180,0,0],[185,0,0],[190,0,0],[195,0,0],[200,0,0],[205,0,0],[210,0,0],[215,0,0],[220,0,0],[225,0,0],[230,0,0],[235,0,0],[240,0,0],[245,0,0],[250,0,0],[1,1,1],[5,5,5],[10,10,10],[15,15,15],[20,20,20],[25,25,25],[30,30,30],[35,35,35],[40,40,40],[45,45,45],[50,50,50],[55,55,55],[60,60,60],[65,65,65],[70,70,70],[75,75,75],[80,80,80],[85,85,85],[90,90,90],[95,95,95],[100,100,100],[105,105,105],[110,110,110],[115,115,115],[120,120,120],[125,125,125],[130,130,130],[135,135,135],[140,140,140],[145,145,145],[150,150,150],[155,155,155],[160,160,160],[165,165,165],[170,170,170],[175,175,175],[180,180,180],[185,185,185],[190,190,190],[195,195,195],[200,200,200],[205,205,205],[210,210,210],[215,215,215],[220,220,220],[225,225,225],[230,230,230],[235,235,235],[240,240,240],[245,245,245],[250,250,250],[255,255,255]],k1=[[0,0,0],[3,0,0],[7,0,0],[11,0,0],[15,0,0],[19,0,0],[23,0,0],[27,0,0],[31,0,0],[35,0,0],[39,0,0],[43,0,0],[47,0,0],[51,0,0],[55,0,0],[59,0,0],[63,0,0],[67,0,0],[71,0,0],[75,0,0],[79,0,0],[83,0,0],[87,0,0],[91,0,0],[95,0,0],[99,0,0],[103,0,0],[107,0,0],[111,0,0],[115,0,0],[119,0,0],[123,0,0],[127,0,0],[131,0,0],[135,0,0],[139,0,0],[143,0,0],[147,0,0],[151,0,0],[155,0,0],[159,0,0],[163,0,0],[167,0,0],[171,0,0],[175,0,0],[179,0,0],[183,0,0],[187,0,0],[191,0,0],[195,0,0],[199,0,0],[203,0,0],[207,0,0],[211,0,0],[215,0,0],[219,0,0],[223,0,0],[227,0,0],[231,0,0],[235,0,0],[239,0,0],[243,0,0],[247,0,0],[251,0,0],[255,0,0],[247,7,0],[239,15,0],[231,23,0],[223,31,0],[215,39,0],[207,47,0],[199,55,0],[191,63,0],[183,71,0],[175,79,0],[167,87,0],[159,95,0],[151,103,0],[143,111,0],[135,119,0],[127,127,0],[119,135,0],[111,143,0],[103,151,0],[95,159,0],[87,167,0],[79,175,0],[71,183,0],[63,191,0],[55,199,0],[47,207,0],[39,215,0],[31,223,0],[23,231,0],[15,239,0],[7,247,0],[0,255,0],[0,247,7],[0,239,15],[0,231,23],[0,223,31],[0,215,39],[0,207,47],[0,199,55],[0,191,63],[0,183,71],[0,175,79],[0,167,87],[0,159,95],[0,151,103],[0,143,111],[0,135,119],[0,127,127],[0,119,135],[0,111,143],[0,103,151],[0,95,159],[0,87,167],[0,79,175],[0,71,183],[0,63,191],[0,55,199],[0,47,207],[0,39,215],[0,31,223],[0,23,231],[0,15,239],[0,7,247],[0,0,255],[0,7,255],[0,15,255],[0,23,255],[0,31,255],[0,39,255],[0,47,255],[0,55,255],[0,63,255],[0,71,255],[0,79,255],[0,87,255],[0,95,255],[0,103,255],[0,111,255],[0,119,255],[0,127,255],[0,135,255],[0,143,255],[0,151,255],[0,159,255],[0,167,255],[0,175,255],[0,183,255],[0,191,255],[0,199,255],[0,207,255],[0,215,255],[0,223,255],[0,231,255],[0,239,255],[0,247,255],[0,255,255],[7,247,255],[15,239,255],[23,231,255],[31,223,255],[39,215,255],[47,207,255],[55,199,255],[63,191,255],[71,183,255],[79,175,255],[87,167,255],[95,159,255],[103,151,255],[111,143,255],[119,135,255],[127,127,255],[135,119,255],[143,111,255],[151,103,255],[159,95,255],[167,87,255],[175,79,255],[183,71,255],[191,63,255],[199,55,255],[207,47,255],[215,39,255],[223,31,255],[231,23,255],[239,15,255],[247,7,255],[255,0,255],[255,7,247],[255,15,239],[255,23,231],[255,31,223],[255,39,215],[255,47,207],[255,55,199],[255,63,191],[255,71,183],[255,79,175],[255,87,167],[255,95,159],[255,103,151],[255,111,143],[255,119,135],[255,127,127],[255,135,119],[255,143,111],[255,151,103],[255,159,95],[255,167,87],[255,175,79],[255,183,71],[255,191,63],[255,199,55],[255,207,47],[255,215,39],[255,223,31],[255,231,23],[255,239,15],[255,247,7],[255,255,0],[255,255,7],[255,255,15],[255,255,23],[255,255,31],[255,255,39],[255,255,47],[255,255,55],[255,255,63],[255,255,71],[255,255,79],[255,255,87],[255,255,95],[255,255,103],[255,255,111],[255,255,119],[255,255,127],[255,255,135],[255,255,143],[255,255,151],[255,255,159],[255,255,167],[255,255,175],[255,255,183],[255,255,191],[255,255,199],[255,255,207],[255,255,215],[255,255,223],[255,255,231],[255,255,239],[255,255,247]],P1=[[1,2,1],[1,2,1],[1,3,1],[1,4,1],[1,5,1],[1,6,1],[1,7,1],[1,8,1],[1,9,1],[1,10,1],[1,11,1],[1,12,1],[1,13,1],[1,14,1],[1,15,1],[1,16,1],[1,17,1],[1,18,1],[1,19,1],[1,20,1],[1,21,1],[1,22,1],[1,23,1],[1,24,1],[1,25,1],[1,26,1],[1,27,1],[1,28,1],[1,29,1],[1,30,1],[1,31,1],[1,32,1],[1,33,1],[1,34,1],[1,35,1],[1,36,1],[1,37,1],[1,38,1],[1,39,1],[1,40,1],[1,41,1],[1,42,1],[1,43,1],[1,44,1],[1,45,1],[1,46,1],[1,47,1],[1,48,1],[1,49,1],[1,50,1],[1,51,1],[1,52,1],[1,53,1],[1,54,1],[1,55,1],[1,56,1],[1,57,1],[1,58,1],[1,59,1],[1,60,1],[1,61,1],[1,62,1],[1,63,1],[1,64,1],[2,64,2],[4,63,4],[6,62,6],[8,61,8],[10,60,10],[12,59,12],[14,58,14],[16,57,16],[18,56,18],[20,55,20],[22,54,22],[24,53,24],[26,52,26],[28,51,28],[30,50,30],[32,49,32],[34,48,34],[36,47,36],[38,46,38],[40,45,40],[42,44,42],[44,43,44],[46,42,46],[48,41,48],[50,40,50],[52,39,52],[54,38,54],[56,37,56],[58,36,58],[60,35,60],[62,34,62],[64,33,64],[65,32,65],[67,31,67],[69,30,69],[71,29,71],[73,28,73],[75,27,75],[77,26,77],[79,25,79],[81,24,81],[83,23,83],[85,22,85],[87,21,87],[89,20,89],[91,19,91],[93,18,93],[95,17,95],[97,16,97],[99,15,99],[101,14,101],[103,13,103],[105,12,105],[107,11,107],[109,10,109],[111,9,111],[113,8,113],[115,7,115],[117,6,117],[119,5,119],[121,4,121],[123,3,123],[125,2,125],[127,1,127],[129,1,125],[131,3,123],[133,5,121],[135,7,119],[137,9,117],[139,11,115],[141,13,113],[143,15,111],[145,17,109],[147,19,107],[149,21,105],[151,23,103],[153,25,101],[155,27,99],[157,29,97],[159,31,95],[161,33,93],[163,35,91],[165,37,89],[167,39,87],[169,41,85],[171,43,83],[173,45,81],[175,47,79],[177,49,77],[179,51,75],[181,53,73],[183,55,71],[185,57,69],[187,59,67],[189,61,65],[191,63,64],[192,64,62],[194,66,60],[196,68,58],[198,70,56],[200,72,54],[202,74,52],[204,76,50],[206,78,48],[208,80,46],[210,82,44],[212,84,42],[214,86,40],[216,88,38],[218,90,36],[220,92,34],[222,94,32],[224,96,30],[226,98,28],[228,100,26],[230,102,24],[232,104,22],[234,106,20],[236,108,18],[238,110,16],[240,112,14],[242,114,12],[244,116,10],[246,118,8],[248,120,6],[250,122,4],[252,124,2],[254,126,1],[254,128,4],[254,130,8],[254,132,12],[254,134,16],[254,136,20],[254,138,24],[254,140,28],[254,142,32],[254,144,36],[254,146,40],[254,148,44],[254,150,48],[254,152,52],[254,154,56],[254,156,60],[254,158,64],[254,160,67],[254,162,71],[254,164,75],[254,166,79],[254,168,83],[254,170,87],[254,172,91],[254,174,95],[254,176,99],[254,178,103],[254,180,107],[254,182,111],[254,184,115],[254,186,119],[254,188,123],[254,190,127],[254,191,131],[254,193,135],[254,195,139],[254,197,143],[254,199,147],[254,201,151],[254,203,155],[254,205,159],[254,207,163],[254,209,167],[254,211,171],[254,213,175],[254,215,179],[254,217,183],[254,219,187],[254,221,191],[254,223,194],[254,225,198],[254,227,202],[254,229,206],[254,231,210],[254,233,214],[254,235,218],[254,237,222],[254,239,226],[254,241,230],[254,243,234],[254,245,238],[254,247,242],[254,249,246],[254,251,250],[254,251,250]],M1=[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[255,0,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,255,0],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,0,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[0,255,255],[248,0,255],[248,0,255],[248,0,255],[248,0,255],[248,0,255],[249,0,255],[249,0,255],[249,0,255],[249,0,255],[249,0,255],[250,0,255],[250,0,255],[250,0,255],[250,0,255],[251,0,255],[251,0,255],[251,0,255],[251,0,255],[251,0,255],[252,0,255],[252,0,255],[252,0,255],[252,0,255],[253,0,255],[253,0,255],[253,0,255],[253,0,255],[253,0,255],[254,0,255],[254,0,255],[254,0,255],[254,0,255],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,0],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255]],x1=[[0,32,76],[0,32,78],[0,33,80],[0,34,81],[0,35,83],[0,35,85],[0,36,86],[0,37,88],[0,38,90],[0,38,91],[0,39,93],[0,40,95],[0,40,97],[0,41,99],[0,42,100],[0,42,102],[0,43,104],[0,44,106],[0,45,108],[0,45,109],[0,46,110],[0,46,111],[0,47,111],[0,47,111],[0,48,111],[0,49,111],[0,49,111],[0,50,110],[0,51,110],[0,52,110],[0,52,110],[1,53,110],[6,54,110],[10,55,109],[14,55,109],[18,56,109],[21,57,109],[23,57,109],[26,58,108],[28,59,108],[30,60,108],[32,60,108],[34,61,108],[36,62,108],[38,62,108],[39,63,108],[41,64,107],[43,65,107],[44,65,107],[46,66,107],[47,67,107],[49,68,107],[50,68,107],[51,69,107],[53,70,107],[54,70,107],[55,71,107],[56,72,107],[58,73,107],[59,73,107],[60,74,107],[61,75,107],[62,75,107],[64,76,107],[65,77,107],[66,78,107],[67,78,107],[68,79,107],[69,80,107],[70,80,107],[71,81,107],[72,82,107],[73,83,107],[74,83,107],[75,84,107],[76,85,107],[77,85,107],[78,86,107],[79,87,108],[80,88,108],[81,88,108],[82,89,108],[83,90,108],[84,90,108],[85,91,108],[86,92,108],[87,93,109],[88,93,109],[89,94,109],[90,95,109],[91,95,109],[92,96,109],[93,97,110],[94,98,110],[95,98,110],[95,99,110],[96,100,110],[97,101,111],[98,101,111],[99,102,111],[100,103,111],[101,103,111],[102,104,112],[103,105,112],[104,106,112],[104,106,112],[105,107,113],[106,108,113],[107,109,113],[108,109,114],[109,110,114],[110,111,114],[111,111,114],[111,112,115],[112,113,115],[113,114,115],[114,114,116],[115,115,116],[116,116,117],[117,117,117],[117,117,117],[118,118,118],[119,119,118],[120,120,118],[121,120,119],[122,121,119],[123,122,119],[123,123,120],[124,123,120],[125,124,120],[126,125,120],[127,126,120],[128,126,120],[129,127,120],[130,128,120],[131,129,120],[132,129,120],[133,130,120],[134,131,120],[135,132,120],[136,133,120],[137,133,120],[138,134,120],[139,135,120],[140,136,120],[141,136,120],[142,137,120],[143,138,120],[144,139,120],[145,140,120],[146,140,120],[147,141,120],[148,142,120],[149,143,120],[150,143,119],[151,144,119],[152,145,119],[153,146,119],[154,147,119],[155,147,119],[156,148,119],[157,149,119],[158,150,118],[159,151,118],[160,152,118],[161,152,118],[162,153,118],[163,154,117],[164,155,117],[165,156,117],[166,156,117],[167,157,117],[168,158,116],[169,159,116],[170,160,116],[171,161,116],[172,161,115],[173,162,115],[174,163,115],[175,164,115],[176,165,114],[177,166,114],[178,166,114],[180,167,113],[181,168,113],[182,169,113],[183,170,112],[184,171,112],[185,171,112],[186,172,111],[187,173,111],[188,174,110],[189,175,110],[190,176,110],[191,177,109],[192,177,109],[193,178,108],[194,179,108],[195,180,108],[197,181,107],[198,182,107],[199,183,106],[200,184,106],[201,184,105],[202,185,105],[203,186,104],[204,187,104],[205,188,103],[206,189,103],[208,190,102],[209,191,102],[210,192,101],[211,192,101],[212,193,100],[213,194,99],[214,195,99],[215,196,98],[216,197,97],[217,198,97],[219,199,96],[220,200,96],[221,201,95],[222,202,94],[223,203,93],[224,203,93],[225,204,92],[227,205,91],[228,206,91],[229,207,90],[230,208,89],[231,209,88],[232,210,87],[233,211,86],[235,212,86],[236,213,85],[237,214,84],[238,215,83],[239,216,82],[240,217,81],[241,218,80],[243,219,79],[244,220,78],[245,221,77],[246,222,76],[247,223,75],[249,224,73],[250,224,72],[251,225,71],[252,226,70],[253,227,69],[255,228,67],[255,229,66],[255,230,66],[255,231,67],[255,232,68],[255,233,69]],B1=[[1,3,2],[1,3,2],[1,5,4],[1,7,6],[1,9,8],[1,11,10],[1,13,12],[1,15,14],[1,17,16],[1,19,18],[1,21,20],[1,23,22],[1,25,24],[1,27,26],[1,29,28],[1,31,30],[1,33,32],[1,35,34],[1,37,36],[1,39,38],[1,41,40],[1,43,42],[1,45,44],[1,47,46],[1,49,48],[1,51,50],[1,53,52],[1,55,54],[1,57,56],[1,59,58],[1,61,60],[1,63,62],[1,64,64],[1,66,65],[1,68,67],[1,70,69],[1,72,71],[1,74,73],[1,76,75],[1,78,77],[1,80,79],[1,82,81],[1,84,83],[1,86,85],[1,88,87],[1,90,89],[1,92,91],[1,94,93],[1,96,95],[1,98,97],[1,100,99],[1,102,101],[1,104,103],[1,106,105],[1,108,107],[1,110,109],[1,112,111],[1,114,113],[1,116,115],[1,118,117],[1,120,119],[1,122,121],[1,124,123],[1,126,125],[1,128,127],[2,126,129],[4,124,131],[6,122,133],[8,120,135],[10,118,137],[12,116,139],[14,114,141],[16,112,143],[18,110,145],[20,108,147],[22,106,149],[24,104,151],[26,102,153],[28,100,155],[30,98,157],[32,96,159],[34,94,161],[36,92,163],[38,90,165],[40,88,167],[42,86,169],[44,84,171],[46,82,173],[48,80,175],[50,78,177],[52,76,179],[54,74,181],[56,72,183],[58,70,185],[60,68,187],[62,66,189],[64,64,191],[65,63,192],[67,61,194],[69,59,196],[71,57,198],[73,55,200],[75,53,202],[77,51,204],[79,49,206],[81,47,208],[83,45,210],[85,43,212],[87,41,214],[89,39,216],[91,37,218],[93,35,220],[95,33,222],[97,31,224],[99,29,226],[101,27,228],[103,25,230],[105,23,232],[107,21,234],[109,19,236],[111,17,238],[113,15,240],[115,13,242],[117,11,244],[119,9,246],[121,7,248],[123,5,250],[125,3,252],[127,1,254],[129,2,250],[131,4,246],[133,6,242],[135,8,238],[137,10,234],[139,12,230],[141,14,226],[143,16,222],[145,18,218],[147,20,214],[149,22,210],[151,24,206],[153,26,202],[155,28,198],[157,30,194],[159,32,191],[161,34,187],[163,36,183],[165,38,179],[167,40,175],[169,42,171],[171,44,167],[173,46,163],[175,48,159],[177,50,155],[179,52,151],[181,54,147],[183,56,143],[185,58,139],[187,60,135],[189,62,131],[191,64,127],[192,65,123],[194,67,119],[196,69,115],[198,71,111],[200,73,107],[202,75,103],[204,77,99],[206,79,95],[208,81,91],[210,83,87],[212,85,83],[214,87,79],[216,89,75],[218,91,71],[220,93,67],[222,95,64],[224,97,60],[226,99,56],[228,101,52],[230,103,48],[232,105,44],[234,107,40],[236,109,36],[238,111,32],[240,113,28],[242,115,24],[244,117,20],[246,119,16],[248,121,12],[250,123,8],[252,125,4],[254,127,1],[254,129,4],[254,131,8],[254,133,12],[254,135,16],[254,137,20],[254,139,24],[254,141,28],[254,143,32],[254,145,36],[254,147,40],[254,149,44],[254,151,48],[254,153,52],[254,155,56],[254,157,60],[254,159,64],[254,161,67],[254,163,71],[254,165,75],[254,167,79],[254,169,83],[254,171,87],[254,173,91],[254,175,95],[254,177,99],[254,179,103],[254,181,107],[254,183,111],[254,185,115],[254,187,119],[254,189,123],[254,191,127],[254,192,131],[254,194,135],[254,196,139],[254,198,143],[254,200,147],[254,202,151],[254,204,155],[254,206,159],[254,208,163],[254,210,167],[254,212,171],[254,214,175],[254,216,179],[254,218,183],[254,220,187],[254,222,191],[254,224,194],[254,226,198],[254,228,202],[254,230,206],[254,232,210],[254,234,214],[254,236,218],[254,238,222],[254,240,226],[254,242,230],[254,244,234],[254,246,238],[254,248,242],[254,250,246],[254,250,246]],N1=[[0,0,0],[0,1,2],[0,2,5],[0,4,8],[0,5,11],[0,7,14],[0,8,17],[0,10,20],[0,11,23],[0,12,26],[0,14,29],[0,15,32],[0,17,35],[0,18,38],[0,20,41],[0,21,44],[0,23,47],[0,24,50],[0,25,53],[0,27,56],[0,28,59],[0,30,62],[0,31,65],[0,33,68],[0,34,71],[0,36,74],[0,37,77],[0,38,80],[0,40,83],[0,41,86],[0,43,89],[0,44,92],[0,46,95],[0,47,98],[0,49,101],[0,50,104],[0,51,107],[0,53,110],[0,54,113],[0,56,116],[0,57,119],[0,59,122],[0,60,125],[0,61,128],[0,63,131],[0,64,134],[0,66,137],[0,67,140],[0,69,143],[0,70,146],[0,72,149],[0,73,152],[0,74,155],[0,76,158],[0,77,161],[0,79,164],[0,80,167],[0,82,170],[0,83,173],[0,85,176],[0,86,179],[0,87,182],[0,89,185],[0,90,188],[0,92,191],[0,93,194],[0,95,197],[0,96,200],[0,98,203],[0,99,206],[0,100,209],[0,102,212],[0,103,215],[0,105,218],[0,106,221],[0,108,224],[0,109,227],[0,110,230],[0,112,233],[0,113,236],[0,115,239],[0,116,242],[0,118,245],[0,119,248],[0,123,255],[0,123,255],[0,124,255],[0,126,255],[0,127,255],[0,129,255],[0,130,255],[0,132,255],[0,133,255],[0,135,255],[0,136,255],[0,138,255],[0,140,255],[0,141,255],[0,143,255],[0,144,255],[0,146,255],[0,147,255],[0,149,255],[0,150,255],[0,152,255],[0,153,255],[0,155,255],[0,157,255],[0,158,255],[0,160,255],[0,161,255],[0,163,255],[0,164,255],[0,166,255],[0,167,255],[0,169,255],[0,170,255],[0,172,255],[0,174,255],[0,175,255],[0,177,255],[0,178,255],[0,180,255],[0,181,255],[0,183,255],[0,184,255],[0,186,255],[0,187,255],[0,189,255],[0,191,255],[0,192,255],[0,194,255],[0,195,255],[0,197,255],[0,198,255],[0,200,255],[0,201,255],[0,203,255],[0,204,255],[0,206,255],[0,208,255],[0,209,255],[0,211,255],[0,212,255],[0,214,255],[0,215,255],[0,217,255],[0,218,255],[0,220,255],[0,222,255],[0,223,255],[0,225,255],[0,226,255],[0,228,255],[0,229,255],[0,231,255],[0,232,255],[0,234,255],[0,235,255],[0,237,255],[0,239,255],[0,240,255],[0,242,255],[0,243,255],[0,245,255],[0,246,255],[0,248,255],[0,249,255],[0,251,255],[0,255,255],[0,255,255],[2,255,255],[5,255,255],[8,255,255],[11,255,255],[14,255,255],[17,255,255],[20,255,255],[23,255,255],[26,255,255],[29,255,255],[32,255,255],[35,255,255],[38,255,255],[41,255,255],[44,255,255],[47,255,255],[50,255,255],[53,255,255],[56,255,255],[59,255,255],[62,255,255],[65,255,255],[68,255,255],[71,255,255],[74,255,255],[77,255,255],[80,255,255],[83,255,255],[86,255,255],[89,255,255],[92,255,255],[95,255,255],[98,255,255],[101,255,255],[104,255,255],[107,255,255],[110,255,255],[113,255,255],[116,255,255],[119,255,255],[122,255,255],[125,255,255],[128,255,255],[131,255,255],[134,255,255],[137,255,255],[140,255,255],[143,255,255],[146,255,255],[149,255,255],[152,255,255],[155,255,255],[158,255,255],[161,255,255],[164,255,255],[167,255,255],[170,255,255],[173,255,255],[176,255,255],[179,255,255],[182,255,255],[185,255,255],[188,255,255],[191,255,255],[194,255,255],[197,255,255],[200,255,255],[203,255,255],[206,255,255],[209,255,255],[212,255,255],[215,255,255],[218,255,255],[221,255,255],[224,255,255],[227,255,255],[230,255,255],[233,255,255],[236,255,255],[239,255,255],[242,255,255],[245,255,255],[248,255,255],[251,255,255],[255,255,255]],F1=[[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[6,6,6],[11,11,11],[16,16,16],[21,21,21],[26,26,26],[31,31,31],[36,36,36],[41,41,41],[46,46,46],[51,51,51],[61,61,61],[90,90,90],[105,105,1],[120,120,120],[135,135,135],[150,150,150],[165,165,165],[180,180,180],[194,194,194],[204,204,204],[224,224,224],[253,253,253],[224,224,224],[204,204,204],[194,194,194],[180,180,180],[165,165,165],[150,150,150],[135,135,135],[120,120,120],[105,105,105],[80,80,80],[70,70,70],[61,61,61],[51,51,51],[46,46,46],[41,41,41],[36,36,36],[31,31,31],[26,26,26],[21,21,21],[16,16,16],[11,11,11],[6,6,6],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],z1=[[0,0,0],[0,0,7],[0,0,15],[0,0,22],[0,0,30],[0,0,38],[0,0,45],[0,0,53],[0,0,61],[0,0,65],[0,0,69],[0,0,74],[0,0,78],[0,0,82],[0,0,87],[0,0,91],[1,0,96],[4,0,100],[7,0,104],[10,0,108],[13,0,113],[16,0,117],[19,0,121],[22,0,125],[25,0,130],[28,0,134],[31,0,138],[34,0,143],[37,0,147],[40,0,151],[43,0,156],[46,0,160],[49,0,165],[52,0,168],[55,0,171],[58,0,175],[61,0,178],[64,0,181],[67,0,185],[70,0,188],[73,0,192],[76,0,195],[79,0,199],[82,0,202],[85,0,206],[88,0,209],[91,0,213],[94,0,216],[98,0,220],[101,0,220],[104,0,221],[107,0,222],[110,0,223],[113,0,224],[116,0,225],[119,0,226],[122,0,227],[125,0,224],[128,0,222],[131,0,220],[134,0,218],[137,0,216],[140,0,214],[143,0,212],[146,0,210],[148,0,206],[150,0,202],[152,0,199],[154,0,195],[156,0,191],[158,0,188],[160,0,184],[162,0,181],[163,0,177],[164,0,173],[166,0,169],[167,0,166],[168,0,162],[170,0,158],[171,0,154],[173,0,151],[174,0,147],[175,0,143],[177,0,140],[178,0,136],[179,0,132],[181,0,129],[182,0,125],[184,0,122],[185,0,118],[186,0,114],[188,0,111],[189,0,107],[190,0,103],[192,0,100],[193,0,96],[195,0,93],[196,1,89],[198,3,85],[199,5,82],[201,7,78],[202,8,74],[204,10,71],[205,12,67],[207,14,64],[208,16,60],[209,19,56],[210,21,53],[212,24,49],[213,27,45],[214,29,42],[215,32,38],[217,35,35],[218,37,31],[220,40,27],[221,43,23],[223,46,20],[224,48,16],[226,51,12],[227,54,8],[229,57,5],[230,59,4],[231,62,3],[233,65,3],[234,68,2],[235,70,1],[237,73,1],[238,76,0],[240,79,0],[241,81,0],[243,84,0],[244,87,0],[246,90,0],[247,92,0],[249,95,0],[250,98,0],[252,101,0],[252,103,0],[252,105,0],[253,107,0],[253,109,0],[253,111,0],[254,113,0],[254,115,0],[255,117,0],[255,119,0],[255,121,0],[255,123,0],[255,125,0],[255,127,0],[255,129,0],[255,131,0],[255,133,0],[255,134,0],[255,136,0],[255,138,0],[255,140,0],[255,141,0],[255,143,0],[255,145,0],[255,147,0],[255,148,0],[255,150,0],[255,152,0],[255,154,0],[255,155,0],[255,157,0],[255,159,0],[255,161,0],[255,162,0],[255,164,0],[255,166,0],[255,168,0],[255,169,0],[255,171,0],[255,173,0],[255,175,0],[255,176,0],[255,178,0],[255,180,0],[255,182,0],[255,184,0],[255,186,0],[255,188,0],[255,190,0],[255,191,0],[255,193,0],[255,195,0],[255,197,0],[255,199,0],[255,201,0],[255,203,0],[255,205,0],[255,206,0],[255,208,0],[255,210,0],[255,212,0],[255,213,0],[255,215,0],[255,217,0],[255,219,0],[255,220,0],[255,222,0],[255,224,0],[255,226,0],[255,228,0],[255,230,0],[255,232,0],[255,234,0],[255,235,4],[255,237,8],[255,239,13],[255,241,17],[255,242,21],[255,244,26],[255,246,30],[255,248,35],[255,248,42],[255,249,50],[255,250,58],[255,251,66],[255,252,74],[255,253,82],[255,254,90],[255,255,98],[255,255,105],[255,255,113],[255,255,121],[255,255,129],[255,255,136],[255,255,144],[255,255,152],[255,255,160],[255,255,167],[255,255,175],[255,255,183],[255,255,191],[255,255,199],[255,255,207],[255,255,215],[255,255,223],[255,255,227],[255,255,231],[255,255,235],[255,255,239],[255,255,243],[255,255,247],[255,255,251],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255]],U1=[[1,2,2],[1,2,2],[1,2,3],[1,3,4],[1,3,5],[1,4,6],[1,4,7],[1,5,8],[1,5,9],[1,6,10],[1,6,11],[1,7,12],[1,7,13],[1,8,14],[1,8,15],[1,9,16],[1,9,17],[1,10,18],[1,10,19],[1,11,20],[1,11,21],[1,12,22],[1,12,23],[1,13,24],[1,13,25],[1,14,26],[1,14,27],[1,15,28],[1,15,29],[1,16,30],[1,16,31],[1,17,32],[1,17,33],[1,18,34],[1,18,35],[1,19,36],[1,19,37],[1,20,38],[1,20,39],[1,21,40],[1,21,41],[1,22,42],[1,22,43],[1,23,44],[1,23,45],[1,24,46],[1,24,47],[1,25,48],[1,25,49],[1,26,50],[1,26,51],[1,27,52],[1,27,53],[1,28,54],[1,28,55],[1,29,56],[1,29,57],[1,30,58],[1,30,59],[1,31,60],[1,31,61],[1,32,62],[1,32,63],[1,33,64],[1,33,64],[2,32,65],[4,32,66],[6,31,67],[8,31,68],[10,30,69],[12,30,70],[14,29,71],[16,29,72],[18,28,73],[20,28,74],[22,27,75],[24,27,76],[26,26,77],[28,26,78],[30,25,79],[32,25,80],[34,24,81],[36,24,82],[38,23,83],[40,23,84],[42,22,85],[44,22,86],[46,21,87],[48,21,88],[50,20,89],[52,20,90],[54,19,91],[56,19,92],[58,18,93],[60,18,94],[62,17,95],[64,17,96],[65,16,97],[67,16,98],[69,15,99],[71,15,100],[73,14,101],[75,14,102],[77,13,103],[79,13,104],[81,12,105],[83,12,106],[85,11,107],[87,11,108],[89,10,109],[91,10,110],[93,9,111],[95,9,112],[97,8,113],[99,8,114],[101,7,115],[103,7,116],[105,6,117],[107,6,118],[109,5,119],[111,5,120],[113,4,121],[115,4,122],[117,3,123],[119,3,124],[121,2,125],[123,2,126],[125,1,127],[127,3,127],[129,4,125],[131,6,123],[133,7,121],[135,9,119],[137,10,117],[139,12,115],[141,13,113],[143,15,111],[145,16,109],[147,18,107],[149,19,105],[151,21,103],[153,22,101],[155,24,99],[157,25,97],[159,27,95],[161,28,93],[163,30,91],[165,31,89],[167,33,87],[169,34,85],[171,36,83],[173,37,81],[175,39,79],[177,40,77],[179,42,75],[181,43,73],[183,45,71],[185,46,69],[187,48,67],[189,49,65],[191,51,64],[192,52,62],[194,54,60],[196,55,58],[198,57,56],[200,58,54],[202,60,52],[204,61,50],[206,63,48],[208,64,46],[210,65,44],[212,66,42],[214,68,40],[216,69,38],[218,71,36],[220,72,34],[222,74,32],[224,75,30],[226,77,28],[228,78,26],[230,80,24],[232,81,22],[234,83,20],[236,84,18],[238,86,16],[240,87,14],[242,89,12],[244,90,10],[246,92,8],[248,93,6],[250,95,4],[252,95,1],[254,98,4],[254,100,8],[254,103,12],[254,105,16],[254,108,20],[254,110,24],[254,113,28],[254,115,32],[254,118,36],[254,120,40],[254,123,44],[254,125,48],[254,128,52],[254,130,56],[254,133,60],[254,135,64],[254,138,67],[254,140,71],[254,143,75],[254,145,79],[254,148,83],[254,150,87],[254,153,91],[254,155,95],[254,158,99],[254,160,103],[254,163,107],[254,165,111],[254,168,115],[254,170,119],[254,173,123