UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

76 lines 18.4 kB
import { Side } from '../misc'; import { hasval } from '../util/util'; export function newPlotLayout(options) { const horizAxisHeight = (hasval(options) && hasval(options.horizAxisHeight) ? options.horizAxisHeight : 60); const vertAxisWidth = (hasval(options) && hasval(options.vertAxisWidth) ? options.vertAxisWidth : 70); return { updateChildViewports: function (children, parentViewport) { const topAxes = []; const leftAxes = []; const rightAxes = []; const bottomAxes = []; const centers = []; const others = []; for (let c = 0; c < children.length; c++) { const child = children[c]; switch (child.layoutArg) { case Side.TOP: topAxes.push(child); break; case Side.LEFT: leftAxes.push(child); break; case Side.RIGHT: rightAxes.push(child); break; case Side.BOTTOM: bottomAxes.push(child); break; case null: centers.push(child); break; default: others.push(child); break; } } const numVertAxes = leftAxes.length + rightAxes.length; const numHorizAxes = topAxes.length + bottomAxes.length; const centerWidth = Math.max(vertAxisWidth, parentViewport.w - numVertAxes * vertAxisWidth); const centerHeight = Math.max(horizAxisHeight, parentViewport.h - numHorizAxes * horizAxisHeight); const vertAxisWidth2 = (numVertAxes === 0 ? 0 : (parentViewport.w - centerWidth) / numVertAxes); const horizAxisHeight2 = (numHorizAxes === 0 ? 0 : (parentViewport.h - centerHeight) / numHorizAxes); const iCenterStart = parentViewport.iStart + leftAxes.length * vertAxisWidth2; const iCenterEnd = parentViewport.iEnd - rightAxes.length * vertAxisWidth2; const jCenterStart = parentViewport.jStart + bottomAxes.length * horizAxisHeight2; const jCenterEnd = parentViewport.jEnd - topAxes.length * horizAxisHeight2; for (let c = 0; c < topAxes.length; c++) { const jStart = Math.round(jCenterEnd + c * horizAxisHeight2); const jEnd = (c === topAxes.length - 1 ? parentViewport.jEnd : Math.round(jCenterEnd + (c + 1) * horizAxisHeight2)); topAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd); } for (let c = 0; c < bottomAxes.length; c++) { const jStart = (c === bottomAxes.length - 1 ? parentViewport.jStart : Math.round(jCenterStart - (c + 1) * horizAxisHeight2)); const jEnd = Math.round(jCenterStart - c * horizAxisHeight2); bottomAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd); } for (let c = 0; c < leftAxes.length; c++) { const iStart = (c === leftAxes.length - 1 ? parentViewport.iStart : Math.round(iCenterStart - (c + 1) * vertAxisWidth2)); const iEnd = Math.round(iCenterStart - c * vertAxisWidth2); leftAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd); } for (let c = 0; c < rightAxes.length; c++) { const iStart = Math.round(iCenterEnd + c * vertAxisWidth2); const iEnd = (c === rightAxes.length - 1 ? parentViewport.iEnd : Math.round(iCenterEnd + (c + 1) * vertAxisWidth2)); rightAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd); } for (let c = 0; c < centers.length; c++) { centers[c].viewport.setEdges(iCenterStart, iCenterEnd, jCenterStart, jCenterEnd); } for (let c = 0; c < others.length; c++) { others[c].viewport.setEdges(0, 0, 0, 0); } } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdF9sYXlvdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd2ViZ2xpbXBzZS9wbG90L3Bsb3RfbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStCQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUE4RDtJQUN4RixNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RyxNQUFNLGFBQWEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV0RyxPQUFlO1FBRVgsb0JBQW9CLEVBQUUsVUFBVSxRQUF1QixFQUFFLGNBQWtDO1lBQ3ZGLE1BQU0sT0FBTyxHQUFrQixFQUFFLENBQUM7WUFDbEMsTUFBTSxRQUFRLEdBQWtCLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFNBQVMsR0FBa0IsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sVUFBVSxHQUFrQixFQUFFLENBQUM7WUFDckMsTUFBTSxPQUFPLEdBQWtCLEVBQUUsQ0FBQztZQUNsQyxNQUFNLE1BQU0sR0FBa0IsRUFBRSxDQUFDO1lBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENB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dHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbmltcG9ydCB7IExheW91dCwgTGF5b3V0RW50cnkgfSBmcm9tICcuLi9jb3JlJztcclxuaW1wb3J0IHsgQm91bmRzVW5tb2RpZmlhYmxlIH0gZnJvbSAnLi4vYm91bmRzJztcclxuaW1wb3J0IHsgU2lkZSB9IGZyb20gJy4uL21pc2MnO1xyXG5pbXBvcnQgeyBoYXN2YWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG5ld1Bsb3RMYXlvdXQob3B0aW9ucz86IHsgaG9yaXpBeGlzSGVpZ2h0PzogbnVtYmVyOyB2ZXJ0QXhpc1dpZHRoPzogbnVtYmVyIH0pOiBMYXlvdXQge1xyXG4gICAgY29uc3QgaG9yaXpBeGlzSGVpZ2h0ID0gKGhhc3ZhbChvcHRpb25zKSAmJiBoYXN2YWwob3B0aW9ucy5ob3JpekF4aXNIZWlnaHQpID8gb3B0aW9ucy5ob3JpekF4aXNIZWlnaHQgOiA2MCk7XHJcbiAgICBjb25zdCB2ZXJ0QXhpc1dpZHRoID0gKGhhc3ZhbChvcHRpb25zKSAmJiBoYXN2YWwob3B0aW9ucy52ZXJ0QXhpc1dpZHRoKSA/IG9wdGlvbnMudmVydEF4aXNXaWR0aCA6IDcwKTtcclxuXHJcbiAgICByZXR1cm4gPExheW91dD57XHJcblxyXG4gICAgICAgIHVwZGF0ZUNoaWxkVmlld3BvcnRzOiBmdW5jdGlvbiAoY2hpbGRyZW46IExheW91dEVudHJ5W10sIHBhcmVudFZpZXdwb3J0OiBCb3VuZHNVbm1vZGlmaWFibGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdG9wQXhlcyA9IDxMYXlvdXRFbnRyeVtdPltdO1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0QXhlcyA9IDxMYXlvdXRFbnRyeVtdPltdO1xyXG4gICAgICAgICAgICBjb25zdCByaWdodEF4ZXMgPSA8TGF5b3V0RW50cnlbXT5bXTtcclxuICAgICAgICAgICAgY29uc3QgYm90dG9tQXhlcyA9IDxMYXlvdXRFbnRyeVtdPltdO1xyXG4gICAgICAgICAgICBjb25zdCBjZW50ZXJzID0gPExheW91dEVudHJ5W10+W107XHJcbiAgICAgICAgICAgIGNvbnN0IG90aGVycyA9IDxMYXlvdXRFbnRyeVtdPltdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoaWxkcmVuLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2NdO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC5sYXlvdXRBcmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZGUuVE9QOiB0b3BBeGVzLnB1c2goY2hpbGQpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZGUuTEVGVDogbGVmdEF4ZXMucHVzaChjaGlsZCk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgU2lkZS5SSUdIVDogcmlnaHRBeGVzLnB1c2goY2hpbGQpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFNpZGUuQk9UVE9NOiBib3R0b21BeGVzLnB1c2goY2hpbGQpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIG51bGw6IGNlbnRlcnMucHVzaChjaGlsZCk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG90aGVycy5wdXNoKGNoaWxkKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG51bVZlcnRBeGVzID0gbGVmdEF4ZXMubGVuZ3RoICsgcmlnaHRBeGVzLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgbnVtSG9yaXpBeGVzID0gdG9wQXhlcy5sZW5ndGggKyBib3R0b21BeGVzLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgY2VudGVyV2lkdGggPSBNYXRoLm1heCh2ZXJ0QXhpc1dpZHRoLCBwYXJlbnRWaWV3cG9ydC53IC0gbnVtVmVydEF4ZXMgKiB2ZXJ0QXhpc1dpZHRoKTtcclxuICAgICAgICAgICAgY29uc3QgY2VudGVySGVpZ2h0ID0gTWF0aC5tYXgoaG9yaXpBeGlzSGVpZ2h0LCBwYXJlbnRWaWV3cG9ydC5oIC0gbnVtSG9yaXpBeGVzICogaG9yaXpBeGlzSGVpZ2h0KTtcclxuICAgICAgICAgICAgY29uc3QgdmVydEF4aXNXaWR0aDIgPSAobnVtVmVydEF4ZXMgPT09IDAgPyAwIDogKHBhcmVudFZpZXdwb3J0LncgLSBjZW50ZXJXaWR0aCkgLyBudW1WZXJ0QXhlcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGhvcml6QXhpc0hlaWdodDIgPSAobnVtSG9yaXpBeGVzID09PSAwID8gMCA6IChwYXJlbnRWaWV3cG9ydC5oIC0gY2VudGVySGVpZ2h0KSAvIG51bUhvcml6QXhlcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpQ2VudGVyU3RhcnQgPSBwYXJlbnRWaWV3cG9ydC5pU3RhcnQgKyBsZWZ0QXhlcy5sZW5ndGggKiB2ZXJ0QXhpc1dpZHRoMjtcclxuICAgICAgICAgICAgY29uc3QgaUNlbnRlckVuZCA9IHBhcmVudFZpZXdwb3J0LmlFbmQgLSByaWdodEF4ZXMubGVuZ3RoICogdmVydEF4aXNXaWR0aDI7XHJcbiAgICAgICAgICAgIGNvbnN0IGpDZW50ZXJTdGFydCA9IHBhcmVudFZpZXdwb3J0LmpTdGFydCArIGJvdHRvbUF4ZXMubGVuZ3RoICogaG9yaXpBeGlzSGVpZ2h0MjtcclxuICAgICAgICAgICAgY29uc3QgakNlbnRlckVuZCA9IHBhcmVudFZpZXdwb3J0LmpFbmQgLSB0b3BBeGVzLmxlbmd0aCAqIGhvcml6QXhpc0hlaWdodDI7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHRvcEF4ZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpTdGFydCA9IE1hdGgucm91bmQoakNlbnRlckVuZCArIGMgKiBob3JpekF4aXNIZWlnaHQyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpFbmQgPSAoYyA9PT0gdG9wQXhlcy5sZW5ndGggLSAxID8gcGFyZW50Vmlld3BvcnQuakVuZCA6IE1hdGgucm91bmQoakNlbnRlckVuZCArIChjICsgMSkgKiBob3JpekF4aXNIZWlnaHQyKSk7XHJcbiAgICAgICAgICAgICAgICB0b3BBeGVzW2NdLnZpZXdwb3J0LnNldEVkZ2VzKGlDZW50ZXJTdGFydCwgaUNlbnRlckVuZCwgalN0YXJ0LCBqRW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBib3R0b21BeGVzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBqU3RhcnQgPSAoYyA9PT0gYm90dG9tQXhlcy5sZW5ndGggLSAxID8gcGFyZW50Vmlld3BvcnQualN0YXJ0IDogTWF0aC5yb3VuZChqQ2VudGVyU3RhcnQgLSAoYyArIDEpICogaG9yaXpBeGlzSGVpZ2h0MikpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgakVuZCA9IE1hdGgucm91bmQoakNlbnRlclN0YXJ0IC0gYyAqIGhvcml6QXhpc0hlaWdodDIpO1xyXG4gICAgICAgICAgICAgICAgYm90dG9tQXhlc1tjXS52aWV3cG9ydC5zZXRFZGdlcyhpQ2VudGVyU3RhcnQsIGlDZW50ZXJFbmQsIGpTdGFydCwgakVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbGVmdEF4ZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlTdGFydCA9IChjID09PSBsZWZ0QXhlcy5sZW5ndGggLSAxID8gcGFyZW50Vmlld3BvcnQuaVN0YXJ0IDogTWF0aC5yb3VuZChpQ2VudGVyU3RhcnQgLSAoYyArIDEpICogdmVydEF4aXNXaWR0aDIpKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlFbmQgPSBNYXRoLnJvdW5kKGlDZW50ZXJTdGFydCAtIGMgKiB2ZXJ0QXhpc1dpZHRoMik7XHJcbiAgICAgICAgICAgICAgICBsZWZ0QXhlc1tjXS52aWV3cG9ydC5zZXRFZGdlcyhpU3RhcnQsIGlFbmQsIGpDZW50ZXJTdGFydCwgakNlbnRlckVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcmlnaHRBeGVzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpU3RhcnQgPSBNYXRoLnJvdW5kKGlDZW50ZXJFbmQgKyBjICogdmVydEF4aXNXaWR0aDIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaUVuZCA9IChjID09PSByaWdodEF4ZXMubGVuZ3RoIC0gMSA/IHBhcmVudFZpZXdwb3J0LmlFbmQgOiBNYXRoLnJvdW5kKGlDZW50ZXJFbmQgKyAoYyArIDEpICogdmVydEF4aXNXaWR0aDIpKTtcclxuICAgICAgICAgICAgICAgIHJpZ2h0QXhlc1tjXS52aWV3cG9ydC5zZXRFZGdlcyhpU3RhcnQsIGlFbmQsIGpDZW50ZXJTdGFydCwgakNlbnRlckVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2VudGVycy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgY2VudGVyc1tjXS52aWV3cG9ydC5zZXRFZGdlcyhpQ2VudGVyU3RhcnQsIGlDZW50ZXJFbmQsIGpDZW50ZXJTdGFydCwgakNlbnRlckVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgb3RoZXJzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBvdGhlcnNbY10udmlld3BvcnQuc2V0RWRnZXMoMCwgMCwgMCwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxufVxyXG5cclxuIl19