1(function()
2{
3	/**
4	 * Download from following URL as TSV and convert using https://jgraph.github.io/drawio-tools/tools/convert.html:
5	 * https://docs.google.com/spreadsheets/d/1sAL1zn-UtmJtKPH4cLApGjRX-TRSJa5dYdfZ9NKYfRs
6	 * Maps package and stencil names to additional tags.
7	 */
8	Sidebar.prototype.tagIndex = '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';
9
10	/**
11	 * To update this, go to https://test.draw.io/?dev=1&test=1&drawdev=1&demo=1&createindex=1 and
12	 * copy the output of searchFileData from the browser console to the variable below.
13	 */
14	Sidebar.prototype.searchIndexData = '7Z1rU+M40Kh/zVbN+wEq98vHkHDbJUxeHGDrfFEpjkh0cKwc2R6G/fVHchKGKMwuRo7Usr21xQyBzUaPW62+qfuP9tkf3bM/Go0ofg2I+POP5kB+t8Rr8kdztPq54Hi9PMWcs5fodCD/QCP2Ev7RPFvGq0D8Sl389QfhMfVxcINnJJiwiMaUiV8ZzVgcs9W7XxgEdCF/ELO1eDWKOXsmj3QeL8VrjbdXhixgXLzyR6NZS/8RP5EfrTEUX182H7Jb23y73Hzb726+pfO3NWw+89t/F9DZBz/qjuRPsxK4IU+xdQK7JS/3gZghcEcXy5IjuF9bX7+lTXBGwjjdAyglYR2DIgZGMaQboeIgdgNMCL2mGQhDHAQsicXhmMwCAoRF245+2LH43wTPgZCwtDV2JMDsjo4iET1DHJbkB2chEAj9zh6EjiGzYUi5nwSYQ6GwvyU6fTMU/kxW6xO6FQVUt49hXxj6VjA0yoohtSJxOIejIVUQHYMgvCXma3Q+X5A5uiJQD09T+vKWxf5SkPDEOnDwtlns49iXkKYhHJU1tfG1dmIBBMW+MJgKQbzXFEBA2FES4JRD14py8AISzgkHHJUxJhBbEtMXhh7xawVDwhAfmqAppgEcdWHHB/NiTtdwINiJX3vil2gkKIA+Sk2JxJRTqIZVx1B4Zk9XoivG6T8sjHFgn4clkdjj8bBdlnUaavDOkGt6j6YJB2pfmQpgbhnI1DdMEJ2GURCA7Mzdyg07o1sQkPJ/dknAieAZ3hk+jXx2OktoMKfhIjo94zj0l+j70xP1yT6NNaNhTPj5DxLG0fa1OY6EDSa+kWt5okHwfo3NTk8s54PVP6X/fEjqi8jx9jufyI8oXmBJHNBQ/E/DkPjx9gOqsNv1fRO2fQA7xfMh6/QnZztuWszPw3lZgLf2gLcPjQAjwC9JSDj10e7dio69v2971Zu2uDOxqnAlSy7Kgr5eU9zkQ5vPCPrx6L7oqDv7/lbv0N8yQtpb4SAQ8h2JDxxFRYe+82F2Gr1lB/qUBMRnq1UiPjq6YklU+KO0Xts/S3uWFMsheTQZVvDNwL8PqViWWOtr4Yk3m/uK5rA08ojEhYCvpYBHabnHWhiP6yXhOIhOr8/GaIxp+MTxqvA6RynJ/CDk/x/PYLjj+EejJkiKr5NfLPN/LjSkaOC1Uke70A+mtb85PogagHowU/aSrq3Yz2Q/oNU9DGiBeSY3eL1ZaaEfiOIFd+pwH8gY+4I+i5aFfyb9/WeS2X0w+Eyoz9l6ycLCH/O9/0zVgXkoxXc1uj1nbK7JEA3m4igRjuAQ83nRn0xH8QFBbxN0x+SP/BI8F5d2DKfblRX6ifT382xNwKe852OxksI/EeWIz575NPhE1gQ/F/+JtPdd+D7kPZKE6JHx5yjGGyLFfjK99r6PAtiR9xLx3e7HhX8uyo45vPUH5rlM8SwgcdEfiHLMtwEbXlPCVzRUy2KL90g6yiMBfKrcF9+XVzYIZI/xgc4JE278Snxb9MfS2S/R+aAsG8xjeSQzdCaLPIt/vCsFwZBDw2UyhuFlGkNBJAh2z2XF5klAotN67fIcXQzZedGfiBqG/IL2eiP49kzGG4o5Po9mvdtC30YkehaL/R80DJIoDRS//XrRn1N3/5RpfmHnGHlOf8vndBEwxqun9FZTCu0pyf+LLKP2XmjsL9Hmf1D0Z9PraFsEJp7NBeXkRdYAe4T/oD7ZPh2xqV688f8U/SEpcczeFyLLJh7S/rMp/EOpO6HVvFdx2qxKdNqo4RmgttsD5XGCg91p8+t/ir49eEN5mbHwaq2ldFbLXH6c75OaizPGjxn/ZQmchwuxCPRtiP0lQaPtzwv/XNSivsw2wY6U3lPYvcvJMMBRhC7ojBM0XMpccvD2MIr+LNRTJnNCJq9nITjQWRKTeWnQK5FlW9vghon1zEvCXKkzameuJ86HuQw+LjhL1qURdjUGmTkhrwN+mcw2xtECx8LNe5WRxtoZjsgUXSWzoqNXjttWZu9OMPpl/1xuEebyGIby9TI8A+Wec3an4XjPYNdYYfumJXsS3cyn7vGeRLUPbNIfD7yy7IG2YgVlNvqP9xQ2nRhKsBMAn8rbG+o4KM1+0G1xdLxn8TC5LctTUPzhlrWzYSW+ntbbjeLfQe/rHsdj8eWrhDvdWk3m2ygpfMcdpd4je6hHh3O3XathHqFv3Xa9WfjgsnqTzKhID3yfRBGaSKqFB71/xSL7BTEt0MPC14hpZ0n0+HpF56vIb/bmRFp8R+PC89UNtWvx9Qao3S6+AddWenFkDqtrQY6ojyacyTOv+BkMJWjywZzXo8rzHarXSmMv9xTWmR1yLdbTQdH51mu61/70AI9Rs1d85azcUcp+YV8L8kPhLTi7FvLfk6LzVV1po3zPzrzCm8iqGt61HzREmBP8LIeFn7GfRSetNNs0q4rPOJ0vCl+v3tVNomghnnrCPi5BxF5t52tUkIcyNzvGIV6Ursy/aTSOPMTF57sfuWgajVwIvsKN5mmDPRou0OYSS9GRW02NDEeja3QhvhSdsl3felj8wHJ/35bLXr2kxVf+NQ3FFR2zcim0ZdSe22AeFj4Qp10Wrw/5PqTxKzr/ueYlGH2ktgqwwDttPFN0ztr9F7U4y1nSfowG/v9LKC++q6IOrTYap9vBHu4+cqFRd3Qv5euilteGpxyH0RPjq7R71a9bxNPzwld3KaPrDIu6dzIe3BU+raIWxpj1X7zxSeEJq+2/zAbxvHs08go/WbRe2+9FmP2ChRbk+7PCFyiqAxXNVtCNSFyKi9OKx5K9G7AWZBafzFnhS5mb+4yNxkVHk2nR8SpGW/aLPVp8vZtB4UOiSqcjs7W2I9lmaszmxc9wt22q4sfRGF3QoAROttKTKPswKB3OMkWF7mi4KDrlerNjUS1fcJY2QJuXp4BcGS5rVkmnXT6Enh6s1wHFoV94Za342Gavtu56qpRGtq1ejrjC4XxJgsIPSVTqyc2WzFxN0tnsRWes1NeZtfGuULPRLDzhusVj8HpYeF9QCWZkn2Gvx7fwwftuzSZf+UlDEiMv5kQOeio67Xptv07U7CWU6+8e8m7Oig5Z7bxjNFVyXfh7VIor0jV6y+d6Mi38jL6DklujZRmC8APa1WaU5HaE1eYO1xOBe7VKQrGaEmQA1UCd4SNwgkbeTdEZd21eJb6eFv4IVPWF0fjQn2ffR0UH3FAawRi1Mf4ihW9O2doX4LrRSyeCb+ErxpXrw9knw+sAvhncopgh8UfRMasFzEYNtxu6WMYvRH5Fg8KfeXa9khsWLjjBcvTXpPCliOpMNqPKYzwofDFtbz913TAqyeNh4fm2bd7gGZ/X68W/zqrdXVwLMZnTMoQqFCOuZ9QLGRMimzmsA1z86paWzXjFmETLyn47OmSxelQvQQ9b7ZlAWphpSNHD4O+iQ27rjpvRgsxmNCAlylkrCT+jBcxjr/DunnKhxGyR1vi+8MpCyYaYjdaP/y68/Kpd240G4W4Hw/JUgfcUx9qoCXdbDSk5Ll9hIuOwDNUWysUzs/qCxBELS9CQUrkOZdRCFpBfGH/elg+tSPHHRylnoFkb7pb8TKJSdPGzrKAl5oacW3KBZ/JC1PnPmITz4mtsu01AN9zbJRBvCJy7JeCsXNrpGE2wfvdjEhSdsJI6MesTfr/16mUYl6Z2wDaan/q+TteBBivhfD/R4h+Cyn1Vs27LjnbaLHHNeOENaqVRlNl7aZPBCNWLTliZSmc2rC8JNwpPeD/QYbZIYyI8b3Tty9UVm7JSy2zWmJucFT59ojTDMJvQngyRx57iF8wLH9xXSrrMTgkVnB/onLCiQ1ZLa43mAiejwk+A2Pkgu4slNaNW8mRc/MvBjX3Chg1jzmLms60fEpShCFQxL8yOqJv8fVF0vmr3cKNBjDsck1VS+HmhVodZ3pE1wSXo86kIstnpt3L0H0HeC439ZXn69Km6w6xcTzzxb9ERW22N4RH+gwpRLjpk5cKU2eqBLeS05wtnZctMmQ3KeSRGU7Yuw4zyet3meeh5hfcElXiR2aF0nneDpoSvaFgGH1Dtvmw0xOxNC9+xT6lrNtsK2Ct+vyI1hG9WfktyT0oZ5Gy2NtF7KH4eymYQY0oC4ssufeIDlyKrumu5ZSVRImnLAc6kBHd66k1FORutw5iKpRdelq1eUJtOUAlavih5P7ORuE1RHJYrLzblTt+iiTHlif9cdMIH2tjsuZdwTgpf2lnv7NfFmb3GOn0oOt9206II35/d9euFr7y3e1HnfnyJPMJp8RMjljlX6b2j8n3ASVD4085qWOihdONIzHoeD5NbmTeVn5hXiZBjw/YKr46tCvPjoGrwclS+117hx/X19gH3jQkwm5NVhHA4R+slC0l0OsSzgKSD3FdFh66UtDSzlyin9P5o1AQ/8XWSEsznKZAgQOn7Ff0hNLUnNB/tIVzg4lcbNTq6lsnR8F8xFq/LsAXUCujsyv9oz+B6Ug4tpBg4X4iXHO0RbNvmDnxZm45K+kB6oB5IGWyj/T4SjeylZUfjn77VyVMJDudaB+zBUAolBPhgvrsoh4+mzBz6QjX80R6BbLBQDvtUewJGTs9gTdg6IKeDcM7ZgoQsidCE8KgEVYX7BSzZL/tOUnJfRz7GPnpkK1x80vt2T72W2fDRRx2WA7Vq3tTbmQNwuqwnQ9lrufig9+2YeitzlEcX9F0ShjRclIF2bz9x3c9cRqTL2qOxnIBWDiWiXAHuZ44TaNOOhVFTEtFu7Bvj2ceL5wa7FLJtDzeXbTF4dCrMn9K1A85e93m3oaXBeTAdo827VLCNwJ7ixa7rSzm4a7eL0ud+xhme+ziKS4JcbTOeObOtj1z2JhGfGe16lZQSvA0dc0kXeEbjnY7ZqZxS8rch+NeDUTlh2xD26wlKbx4vWfhaTurZm2fnQN0bXpeEtnqdJXszUX3c+2UY5eDeV6azWVDkt8PzksAGoMhvSfwUsJeyAFcG02QOHeoD342n2TVsLAt5ZcpV5usE+uRLAtq+Ttm8A7oO0VlCAxm8LTp0pcHgW2sEC9QfabxEHg2oz8KtL1p0+kpHlex9SvXhV9EW08DXuDS468qFmezzx3LgHTMux2SVg7hSfJX9rr8+8Omoyg8Zg/3AKuVtEPcj/kECEi7isqTiAPidj5QL5qWJY6kJicw1nV8nHhE/4TR+PR3KXhcUXQjyLzgo/LiAltK+JXO+2duC02Iuv0Vv71Rw5KqUZ9YreSAvi3w3lJaSmVVKHrAvcUyeCVkXX4MrI4GzX1PPBXeC+bzwpBWLMHNsNg/S19+98pyUSm+dzLer8gB+w4rfo1bp75m9nXUeoG9J/ML4c2mMkpaiuDOHY/OAPrn+uzTqRPUurUj5Nv1QGuZKNZBZZ4f/SEs9U1/nPqRPlMzRZDsFIs0sF988VGacfMUaTynq8JdTTkKxILnOqJzcs98M1+c+EjrGjxl/LQlyJb/5FU9IF/kFDUhUCtg5RLHygF0S0VZof8VW1KV9xaLCd9ZWr4N/xUTU5Xw9mT6URKpzMMh1aY+pz9kLmZVDaUMA/v2qJNIN4ITcvMOm1q0c+Uxl2FL2+tkcoMtGlJz9LIvZrcSxvpJc00bOnuIXzAk6w5Fw8cvBXenHlD11nwN32XQC8zkqg3EIQZ9vqwvLIeBKCKWXuQJLH/h9SOOy6PG2km2zED7Z1BfKeGE57HEAQcLHx8eSyHdnvx+W0Uj4Rm9vMxFp3Oo8XNDi90fVno6zPfF0mAcsKXxpSr2nNIysZVcl2qRHNHomcVx4oW7rTpDUR30xRLs3KThsJWTVym4E6sOmM+FaDpdYfM4ASSlHXjKLXqO4+E3G9Z2eHPCL43KIZ+KzFt7HVFSLDdx3JEgT9ViIOo7xDEeF1zGKZZj9qo8+9an4IRpwjotf9mZfozySGRoGSVSCeLhdwzC9Vk82fSUvZHvDXfO383gpPKlS3Lrv6Hb08LYUdR9AOZoc6IdUcsA9DHAUoRZqlwS6cg88e6vxXKArHT23DSbr9eL3ae5D0DFv/Msh8rpztfNAvu+ZXuAZp35J+B80PrQi85ckJClz9hSXw5xRskTZ+03mgf1afOIgoJvvkRfj4l/RUrMX2bNzeXD3Rrcl0S9t5bKnFd43+JVw1EB3ZMViUhLyqmb/Qnw9N/TNkjAH4aSOL/9GvVqthsZJENNoz4wv+gPQbgyfywOQ3E92ZuSmdrQc+JVZWXasmhR/kOqdUil81ZWyJ/tbg3JEpOYpOnb1nLWj9Cdnf5dEzFWLMnuWKQ/cnInXVys8C8qiXkBEhMt8mloiTle/ztOScFc0jJWD9FcoDE0uH9H4clh47B0A5+gD5XGCA3RTInkHEYPf1KxXCVYL0MsBHEY87JHx5wVnybqifnzqL9smxKcDmVINcdFhK50V39owfB72rm2zDuxLId7hHE0JX9EQF741lzLCrL77sVnod3hOGZqyl+LX4jW7ipRnbr+QB3APp7nT4l/TUMeBtDIHdXPFLS8OFP7UVHRK9qKMPJA/0pMLKocKF5229rC4fGhv36PgsBXtnf36aJ6w0Rmn8xJc/tpvLZK9L3GuzG/YpoUlGqzXAcVh8VNEfd2O57nyn3IcRmvGC38LTG3TZQf7zeAWyZpezoKg+Mb5gb+fOa71Jegc+8+neO2fDiZD5K0wj9H9xEP1Wq120pS1MA8D1Ljfhx8oPDhdLON3Cw/Ik/w2WmOfhoub9LtRva0+IvFR5uzl4+f19lQOMHX2MTUPwyJySR9Skj8Qy8yDT3uLpg0YzQfGrwk03XZKpg6YTP3QE8ufzEadDeVXVO/X2rKgieIAydph8Wvxtk/Yb2dLuwxsuNNUOsgadSdZZdVIubBq1VPxEngqZJ9C1ujX3BQvC1ux0a+7yeqDiNvxWTmqtqywalesPsmq2W+0K1afZdWqWH2SVbdTa4Ln0jFvHwguLfBcPrgmYIBLBzyXj/L3BsD0wYNp1g8j2McHU4evYRofpFOODabXbNU2ofxNWP/ku3DgQnlgbScRilX/LtQPiZ2FU2vgDVC73Wuf/I0Gc7yO6Q/yNrbRBWQWHN6BdyejunXwW9GCg7tl0wDPxp7cNMRWq+j8jg58U9GCCb1lA99c7B32VjDDxgHDqN4/vCZoAk5fHFVwqVjSNAJKBy6UesvOPurX6jW4VBotS7LSl78OlUqnfVjsfWwqAsD8rStfs9aEJDRK2ap5OEPMhffJ0UT8gMS/Sp1QQ+1eCEmMLOjh34JqA+Zkwaf6LacOZIGyYAoOcYyD1yhGLXG8f3yJExIhK1vujVCjJ8zm/S7OIfm45SckaFb23xu0VgXtS9AqQL8H1GnXmifn8BC1lPmrFrWVQNRyAJGFJOJ7RB0HENU/aIdnklEfPKFGw3yY6B2hutBFgOH0zScX3+AoXm+jhp4YR1cTQLjUe+Dmc9S/o9VspLRGJAjg8vpgJJktXq0afF5Wgisf4qrXHMAFSLzqlfLKQqtZSdeHvK7nJIx3Y7XTutCPZuGW3NG7nnio1RYKyiNhJD8wVDYW4lHb8iw08H15LXh7RxUuIgvic0t+JpHMcNfQrjHg225zoD7LGrGG8B2mu0E65z9jEs5BVwdY49RotKYTdHlesfoEq2ZjMhGbsaL1SVrTcUXrs7Ravcn/VrQ+T6vSWp9j1azVO/DCnnDoVPmpf6PTaVV0fkunXcnO7+m0BZ1Jhef3ePqdKVwuVqIBOy738OXGGp+OvHoEnY61XdWRV0ig07FQS7Gh05XNtuq1Ey9gu6olOXM4imgEl5aNq7bvcfUcw9W1iqvlFi0bF9zf0eq7RatRM1++8/3WQ/V2s9beHyY6TKKYrQjf5Q4mAY6fGF/BhWfhTNyyExp/eIO877fn032IFbR/hTYeIG90BR1Zb39olYXC+w2xVru1kbGTQ2ic/aCRQCMbMcAjeCh05svMNgw7H89MhomtoTTabdTNFwRNlq+RbBz8q2lF6x55MeNY7akOScAsOACHoD5Ua4XqNmsQW5E6OxvE1gKMzcImvR96qC2LGcF7AhasDAmn02j17ie7pJ/sTMj9XTN4qKgsaK0NqjSO6hQqC5pKoho2GmjcRJvJznDpWBIkQadW4fkXPC0X6FjbWi0nhMcank6F51/wtNxQPdbwSOlpgMdjwZJ+HJyftOsNuEwsnFaSSadicsik24LLxIJqkUy6zVbVNe4QSreCsg/l4Rw1+oC3jxWVIqC0KyiHUDoVlEMo3XalaT+iUqnaQyq9SlYUKmT2Qbt65NW7NbicbGia33BqQuYESJ46FafT5fr0aoKEA9m+/NX67n2nBECENHtJXE2+iifl4b1GMVkhPx37ex76AYsSDrgcIWsyLyc8XUfw1FtWxCfqtN3gkzW893U81+ETDekZDufoYnQHXe00zMnNhLMbcVQJfXzTadT8bUR4I05g+RhUy+/5dCo+/8qn14bKp9m1zmd0U+/U0GUPDhRd7yIXKM1GjVRUDqh0KiofUllXVA6o9IDLSlYvMy8qsGXFEpV2ReWAShv4wWwBinfTaNYiUFR61nWtgNKGDcWcpOxaCg43lcHoIiA/T+o18e8IDh0bbhGdrU6vz8aoXq/Vag8DdD/xAAHRnF4uFqZBpF2rnTQa8Klk3UV6VLrtFrph/mYvRSwgaIxDvIBclpdV9+oBuhfKBcdogkPyi9FfNK74pHyaDuiZrPPJtYB0HACSNfKtBWT+U3jOcFkYVbdCKuTBDBhH1pyaLo62TKZdPcAFYlR5CCDddiUeWxo/m8LjQeMCFd9p4mg3KxzvcVTS8R5HR0pHEy4OoyftFgdg6TCNA/hmMY2jD/iUNcyiC3lytXEW7UqJ/sLRE1rj7zZcHEY92Z/NfoXj+ZSJrwE5vSUxx9tC2r+bJ40zePd5NQPw39OFagIaTprysvxgOhzsqo6hYVKs1nrG1qK5YepWmP4T07Rfg01J9YGyTk7OD1OtgvMhnG2RpNTZcNFktXPyIbPG3EfT1kkdvOhY5rM77NGYzZMAUK0tiDP/jVPxepzkwufvljzroaOxssX+7vxCU22ufUKbbXUuWwKuOY0IGrdcOOWz5kxyp9R2gVK9ZQNTddb/G5nqlP8PQvDP96zp67zItMCTyVp9qEsmCbcue8eZ+8OGNbJCaHdXfzdt/fznmsuRKRtlhBqtNarX0OXsHBBCy3ppn+C2Spr+Q+aolZL6DcsK4AHAKqL973hSN+Wth2clR4egRjjGQyLN8O39/5m8/78dmdXsAGKlWbaSA6udWqrXpJLaMuo21hWkDyD97+jufUeJSxyTF/wKr6uEfWK7SHfjBHDhi2kLfY8LoMtkAOxzJzIjFveR4HIDF4zpMIkEs5nYhRrycpmwhgac49eK0DtC/+fCe6PUrTcKVGiWN5wmZDiG00QCzgXlBE3roC/LmFfFKZW/G3VYVBogqLSAUYEhKy3Q94ks6ZW/W52SU1nT+Sle0BiL4yc6HWz/Jv5jcSBRztWg15pRGck4/0HCONq+tiPjp0EO8YKwEWM5PfFGQTljccxW735hsP0vY7ZW+aloejUlkHOIZr35+wEZ8fpuXVEObNC3QegvGf+fiswBmSFnUXRyRvCqonNIZ0QjHyqX5uGxZIyLbKxATjYB5QmezwMClVLLovRcpt0nINOxubeuSCA/PVQ0HziVxtBcr9YkCAjYA8smmwlnsOD0FR+q2bAHZ5rwGQ3BqhtjR9Z6jTmOkwiRgKzkqk/HOFwyNc9pDYz0d/fI1LLtqN36/mjUzrcrzAOSx/xnEktXYtueTawU3bJ//gEDrrnPLePpfixsyXrNeIzOpEdHYiCo6qqIQUJ1QxZAMDXaIHfiltMdDaGAUnVWI5syPzIo75lyODvPvnaXC+T0KVmQ6HT49nep2kfEx2ltyzfP5+QlDRyxgM6RtxR2FRTToX6gvjIx/LXkvNAJh4UulshbEzIHA0kVtGxK/hiQJoQ/MSG9BJo8AUSViM8Lxo0BuOHe9BNYoQLIjKSHh3AGIcUuAe4+YTCsVtX2+zdCAK0Ci3LEVmnhPeMROkE0YqdnAXshaeLtAodQAWUUo1+LFMbntfc9B0y/3lOiesB+kqzQJFmtK2T/jQx9e5NZOKFy4MRGVPwexwswGU3gvM7/L/FjONlx4LQmNIpZWMH6FCwZvqpQfQ4Vk0ktcT7CSd+AJxZj/lrB+hSs1JeuWH2KlcyisorVjhVP41QRWnAazoVCPx1uXgEK6IMSzH/js12dgHO5XV9+hIT1zuCqc1CgrjCoaAxkVNerNfbjCtUnUP2JwZ55oDhtjM8K1X+gSt9qiHZvi8bYF69BqY2BiG1MgyDN4CSBWBH9p7IaMsGqzsWvUauOyM9Qq/T+Zzk90BnHcoUVqh2qOafiHU5H8g+gUDJe/kiXkj0x+B6EvBmT0Hnat+sMcJ2QBTDb+KZwiH+QV8YFngCsgjbM51Xakt/FquUxtv12uMSr2Sa7LDPwT/L1aqNJXlcEx+k432QFF0i2IJ0ekE0cXAhIskIbdSyEZpqsZoEUpEpBbzF5a45fKxw7HGmQ+5e8yGqxX9+N2Q8pOzvNU3ZkT4TMJbOL9M9d5glN8QzO1c56raWjgjZL+zoaeS2PcbkOHKDNm4EBo6WbjwAGfRsTsV5AufGmwqhtH9F2jz1g4dVDwWRZlDYnGKj7eCoRQ4JD41jsnuj0TJg48/TsAsKjpXU8XWzXpQGEE/wcLzlLFksgSJo9rT2jjWQY4NVa+OMXAQ4XRHgOyTqAc6uuradR9OkwASeM0hZCMIgoW6hnHEglH+9wiF2zIrI7JongiAgsKOjbiMTCdpELOxG2DHsqir2SO6jzn+tALK3i9B+cZKu7kzsS0SjGIdwwKSxMaRij2om/RSesn/m7xh5AyDS0HIjcuIyS1epV0PkBJm7Ra9sFkwhBCaCwsOxWXbEIjMetsMjWi0sfxXW4uS4EBIdCw7RgXMul+UupQ2QweBNG//YrLAHl/LEdl/iY03fhem7+eh0ioXB8SCUWtpG9wal4bHhw+kR9giay92jFJGVyR+aJD8Zi6do15e6SdZxwAmnP2A5UeCR4OhGKRBavhQt0RwKCI7JJqgBBdJi3bBlmRAMSwtlEdVWnGJcZ8VWc0BvHCAgUu66QF3NMQzASYjlAvqMB63KbZSgPYm1ASNj2lR8oeZGHzWWAowgIE800db5M0LcbOaEEUPmHrejkUpZykp8bv5DL3Fs4J2EERtP2dJSKrFOVHTzflqeNZ8QS6TtP6JqgtAr27b2B8Orr7LL8eZ0HxI859VNYYCBpGnj5Y7qgP2VjRXmsC7WEpsmMRDDlS9VT2Y62/MldYcrXNATHqf+f8xHNYoK0/YDp9P19Jm1qGmy2IFTjAII0vSd2QcNQ6K+K2ReZ/bFpYAkVnfXj8YBdwDbRNPEDsDf8oAlcGrSvYH0OlremvDDdPg3g2rNcoWKzLWTpDkQ4nKMLLquonDDwMw6oy5/aHZkJgwwMH9Wwb9qlk/YGT2VKbj1FpFAdCLTOvkxla5VgGlqjgpYdWrOC9iG0TSZvImPOINV9H9YRubG7YKJST8Z+pulb+bOaLml4ckGDFTr/gdeMA7pApDfkNn9U9ycf6CwgrIBFCu+RJ39r7lIQ2jSzFf0pUV2HJzc0JGh7T3osX4VCqK/lMaZL0ebixVh8blhc9DxpPS5/hQQDasrQtYhC/NcyfjfBMZQ70o2ODRzrZLWOTof4B41fQU3kaTT3NWwmW0cu5MssyNuwnRQIGB9W2S6drjUiYBzUxh6Rrj0iULxPazIi23iA0h9aZQI6JC5xhLZj4WCg6DYsyYQk8W7yGwwaB2WAxg6WS4I5pC3S7u5HE+qmQFwxTv9hYbxVnkBw1NvKFPi6MSBFuk+pw2FCuLzGH4gPDASFGs3tm0KRzmqCtD1Uy6JjngQYu1N1TsztEC+ZrYSbR9MaYDjCUa/tA+lmur+lB0TIBWAS9Z6xjSK7ucKZRNLfb/mWLQ+mgwHedOF+f19bGDtEHrafFRKMutLspd4ytUHQCZrT8L3vDgWJXkx4i6Q2ur7VAvM2M7nC8h7Lue+nEuOjR8YrNvts0ts1bIUXIYFjtAOBI/39ish7Ilevc46ToBKUfSw39P8ldI7+JFCuDwPhckd8uubMT0vtKzR7aDYZ/80g+grNezRpvKBCskMiB1sLzbIJoHzbqBqo9fFfxPOVidbv8WzQvPMLKj4f8HlzDyo6H9CRxl4F5gMwlcb5LZrNmn6k3crWAfbJihSm0XPOpDhbyCyyhLWpVaowfYBpz2DeGocVqA9ApTZiReY0Imuclu1Hp5d8UwPo7V76Q46dJHEcvB9FCYOYXnX/2wqzx5Hf8dqMl36Hq0KzQ7MvQvQJbOMPu3SEy/HqB4D65wGjowSXK0r/RinaXHWYcGkC0Fj+rAKWEZhUV48EjAUOjNuE8BUOxYLRON2RFaYPMckuoAmnSJiYyUyYTBWmDzGJfVYh+ggRC+icPtG0D1jAIgImdAKNjpyNULF5xyadDLvbU6UHI16TjusK+0sakuj0/GfMk3SqMLC4SF2nYYS3WaZw/8fbheZJClaYBByoCQkC4Zn8I18ENHBCjScBACVjt+A2HlRMd0yIFRijCB6m7Xui7Tuib7/uE1XQPg1tVxtcIdsi+yE2Hwmi0zMMpdZImRyUrd3Pw2Y5OhjQt2vvOxT5sAyDcxLI+NCIJ1BqgJXb7xnTRvkiASUqeo00tMEk4fN2Mk569+IsXQkUNprJRl04AorwKWKCpjh8hoJEkZeuUdUylIZLOllKbKWUivhzKCxlwqEWdnZNi8xvAaFvZ4yBiUSrnLLNFTg2p0oLfRLVDVmA7SBdr9lRTuhbGnpNBwVsKvrSv17iCFC3bcVEzDZ6SBfVdjBTdcAdgJHmIeMI2mAvrbaXulAuGPfJ/GTE8VMsyLC0yGoKqGmQcme5n+nOsjadhIfYh3KTXclhWEHRgMnC8LmdttYSnz6AIhrN/ZZBZoMSksYVC+A09OzaDNFc4eBpMxZx29pz84ZA0BzYcd1MYxt04VyHckY86PNmv12IWRfzT+w/C5tt7ojoZGquo8vmr5D5zycsiSGFPtt1i5oGUjtppZlKr2cYhNwtdwQDal6n5gkydZfRJSJrktBZEjwjTxDBCyh2it7sa10qaV474fQfoWFBq9aGWXN2wtkaDRbb4mMYSKwqFFiapGXTnH27eQUpjmQ1vr2pbxxxCubwtcxjc8Igb70kHMpBYzc+sAvlgz5kzLo2gNSHVX0qOcDOFmbrv50Pj7dsxRmOwFxDVDtEWgJTFW/8O5o7xp6ggulb5pJOqYQmO/sxk7pZH3DHSHxyOFeaDo5mC0fSFok0WyCfTj0LaEZUfkDYisYuFik1jhxVDQukLnAQEWBgFCu4Xm9Y4BKwTYsgyFvLvJ+kgAGvks0CApQsrLf2lXCmiVa5gECPNF6iCfafAbWmtUplM3wCWji72dlnYjTrLltBoG9nBFJTPyXfYR5Hau9WPFIe8k9pzz09CRdAwBlRvCJitWBKatVkqlGV8otPau9uzDh5KHsJf8I+QdfhnMpeh3DuFCvGXc8mr/NwU6N9xtPqFjAy1bHpQf2G0aYnVOpGyeHs4kyHQsvqtcff0NoiOtnVkW3Kp8AQa8AjBulKieqANow6oL8BdAdpywEUIO+ZcjgqHKQITZeyQV0grIIoCUBZBTAEiq3AZPj6+2Xz2UYw5wXkIgmCk2kyIwfn2ZBROG0xGjajYjtWEwrmeAchOx5ZUQdkp25adiLx2aJTHFKhiKPTMznwvP7fMJ5oEAxZIING4n/UrKX/iNejmLNnsvtJyNLZpl8EdQD8QK6UeaWHR1q6uA9ppT8ZbFaty6vhCC81n/zBQOijAxsR4o6A9RQr4LCy1gwvVwRsF2z6fezp+LzYAn0PhfcmtKyj1A5rp45PLfE/UXIIgtZbO4XdCXmYHzg6rgvhxqArHPvCf3l1hJsiZR8Uhxwd218kDD9T4wuRV//wBt/ReY0Ziz5RJQ4Dl2KLWRCvW4aE9o/cBGbDtvDIZ+apg6B1UMRlwdb3AhY7Y1Ps9wLpWbApvBA/O6q9rGzGGM8+0ySj4rXhNSXz+Ss6+9TAdhDMOv/ZnudozJ4Ym8vun46Q0pauC7Her2Ia4jB6uwsQEFfMiW7LJjP29EQc1V2dzEejDqkRp6GsP0SPOHYpEGZTuhRmDUeYdTsWmV3gKEbpG7gBS9mUH1RhHROW+IKm3J0YmELrg2thR6T1V0ifnNH1+0GculFdf0eiGCcch7Ezel5tjmdUZ73j5YqOV8pE6rXMUcIvAlsSHMRLH3NyOgjEZwtxOpV+TObUp6Ez21NxiTIHDa/eMGgyDIXsLUlEsSvklPPSHrkoolEqezeyGXco7TTvVfztE33nQJDs6ZppeZE845iGjkADI35DzOdUrHnhTBpOiW1kNnRzJEeQF+OnJzTgxBm91wWyW4c4XiKxOle47YvdR11ITIGTv+BK2qmrWwCUF7URwU+uMOuDYcZXOHbqcFDQZa7Pyw0dFSuLnQl+q/EQa+bI+aujrpdVZOjRoWK9pmYWLy9uF3hFg1c04dgX63BG7HRTe7nhozyK0YA6GiC3B+6ShEQswNGjwd5+3bwPOp8nm/vvjvKzJnfifbg7gfR6TTknMgeG8+XWcISbKm6Zi7tzw8aiNY1x4IzEwdmoO3KuyFxPN+mVF7nr1SoJ6T/p8eDM+QrF278On4iwhFkSoRGNCHa1ct4mwbUQPfExXQEHJXNzLT5gGMkcmAyqu0IPjtil+evAteR1tw4E4F90HhJXQpxgqN0koTt3hRRo1pzYMV6tmPiZK8l9MEou1W1ppxvxQddyfgN3BaFyk8haoHiH8IbOOHbn2i00CbwjPuNzZzQfHHxhvGk1GDhzCVC7aj83eHfXjiADE3+6JQl3KXUNRtZuk5hTlwLsutcC8wL3PfRdEjgwJ8P3JEYTpwIn7Q4QkZssMV9h3xWRazeBiNxk+RqlxpxsoInXrvBTXQlrcndHFlSs3Kk8LJRgpydeQDc4XCSfmpUNAp7a+K5nLRvrMZ+KfesR/oP67tTXQUnyeAlfuNNy66BpjTVu09HIEWZg/Igpc6fbz8EI58z3XPOidh+IYzViSehMXZ2yRa3ZJI9LQgJ/iSlHA18cDRGdBcSZ6pPdhX2gGBuOYrSm/T7G2HQEo9p6w6w0hjhOZGE75s4cINrBlNt0zV+H9Weypu7kxHq6lwB0cY3xWmzHG3cuhfVsC9gYc2e8LeusCPcTZ7ysXdt/e5uRORNF0j4YdVndknWcOFPipW2O6eKaBEnMHIHV0Y2O68Ly5B+u7ER1pKLxneiF7OUpcKdFr/W96CWhM+64dlI5D1iuON0gYLniWls3TiWsVgXrc7CmURLiFXUFl5IfNo7rnuMwccVN7LQsq60H4hAs3Tt+X4a1JmwdkNMzPHt1xnxQ3MR6rZEV1yRdtSYuVwyIrm7yQ5fWcInDRdp5MXaqpkU316vNjYViwYnvEDM1kGpc1i7ICjszp0S7B7surbE7rNSWFW/fm6Tljovd1I1H5AHLlROyqRt31oaVrFauJDTUJuzGYU3InIgVU+zMoagbTNUl5i3Zi0PjXNR6WPPKawvMFf2lBnKM+0OeWG0QOFMgoVa+Zr81rAvsPqQR+ekILjUCbdzwesRiKcJ/vGNs5YwWU9zuL/S0zhWbK7qsp1vMr08tkOO8HMHVtm2NPbKVQ25RS7vRfD68XNmNLWviFeEnEr+enlG2xP9g7krBfr2m+JKZJ2h46cK/TmyIE4cChtrZbW1cS7JKL6s+Erx2FlvmU1IX2wUOgo1t4T+7kmXTbracBzSWxMhbksCdcnLrW/SC4wV1JlDd1a2+18V1hcN5QNAjjZdOdXzU7SKnzY0uluiBBTFeuHOzrWX7INij5oxZqxuRzZWaM8V1ugVQutT+ImSNRs5c/dC+h6XL69aV4nzrJsYtC0+uWUj/SW1aPKdOFaoo4y4zx2f16aHzMHZmXwKQNuStmENRRuvu5q+cLxpyFkUOodMtstZF55o2eyvn/PJsGl1iXkDX6MqlqGNXO6ytzSxmnKA7YdbG6H7tjPvUte0IKNxccaAsajWfktAnp2JFjGNBzxmrQxvZZuUazMZ4ERJX2oB2dS+Q5MCL+sLY8NnalRia9qUbfWa3iR8Q7E6xmX5QIzdkrip/C1L2SMP5SrBwhJg6qN0ksTXjcXQ6WK2XNCbYobSTbumBl65cAxn3l+5081RFLLse08R1hiMyw85syba2EtPlRUPmJ0GJGj9pE2PCI3/BwbMrwHSvd+UALEY3OAl9Rzv9tTNXsusiG+LV2qGrEor12jWuxba8HDVd21Z4PVF3ijJsWxWS14K71LFZ8SezR6+1iYXMnfoVNXeZvVw2F1yu6C/1FnTLvAJLuy7f0CdX4ojaLfu1iQV0NXMoYamdHdflJRO8aCh0fsxfkfdMZU2Go/rsC8nLY9BzRb2psmfe/H/1A4e2qnJ4Ghe2EeUxOqPOdOlU5csCsB8OiZd2NkmXFnsJl4KEc4eAImbGjVoVnKP637xCO/9JuE+jSp99ktcF5eSFMVec84POItnrpLSBRUuXVNnBkLjsxcU5EXNGhym1eHXj2n9HbELdSfbadtIlMzQMCA4dss/2Ja1jfGtessCVCT/q+Afjtqxk5Y5oabcV0ccVzlmAHcGlPTpaF9cVFvr+MqBzd0RMYdbpGGdGn505H7Wn1+QAyyHRUoKwxg/GK8ZlMZT/jKYcU1dKoqxH/q99grbGa4Xs88i8Zxw7hGzftPjKXSVdZsK0YBx5L3S1coibbRvjTxLLeKKjuIybF3/hV+xMpaJtNXZDnwj6UxyYzlxPOgiMGWc2ZjHjM1ni6UowUREz88Urv5A13ETWNK7GJtQPqe9ayzLbVRhbalMs59I7uj07xp3MPWqO7lDzFYx3OFwQvhuu5I602S4tVrg5I2+6s+K0uTH/GTlW1Kg9aSkfaHJIgkvjvOzv0XSsxCzALgW2bZdN3bEXaeO6gks5P+vGcSWhQ0lftWON+S354Agp1Zw1XkzsYRqgM4d2onaXAm1gIY0xf0UjKl6JcODaxFDbroAnPppwoB4oeUkhOcJNe0CaPrdkhpFbxdmKrBnPcXqERPjFTVpt4wEhjwRP6DJJCzSqpHAmck5HHo0nN2UymMxkpwx3dFnHtnfuPVP0Z7JaO8JrV9Bij1dA5g7Jl3pPzngSRfAia6n5HVNmfdvKbIWDjQvlVhsb+7cmvDANAvG5s8Jm3tAQyFZs5s6kIdUFML89BTGh0hhx5yhQu0GYl7KEO3QPQG1hZh7XtkjPnbTmvq2xa8togVjDFWJKVVDmYdw5EHNnQ+p3+tekNSVhSJ3pWWnbqKhCPRlgybi1I6x2sX1rLvijUylx7flB2rTEB4vSZhgVsk8iW+KApKkkh6DZbuos+9JHbln41uWMsTm6xPGScIeoWSuMiom/PB04VPOvuyWnYsEanBz1gvqZvSAdTkO8Ihy7KlPZ20TlwMpRucoej9BiRYIATZabFbpAq6Vr1mvRYqsVdrXRtVnFLlCtE4cSabqjM7RYceZMYtumTJ3/X+K7UjGnRpkzVxpqgZK2ujuDBNX4stHNlzZIdGjeg26bLB1WY2dDpV2j1vqEvbhz8tUtnnxy9DVzBZRSoZq5RkkLlOe5gslmOGFKArKW3owznnJrP071hXRhPrxc8ZabupWo+eBqOoJLmdH81l7ZNK+WK7zqILRX2xFcVnfjvXfmCKaWbjm4DqYHOicMbYKijvBSbIiW0TPxEW+ac4+xL/50xS/s6jad+CoyjsM0T5heAz1tocclEWrMGe9HCdNkPx731q8PcED5DLuSZFWH3fWz+0T541sH2CH7X20flj1OcSyCrngE9dq+C9XOHmo9FkJXvIS+dlLtWARd8Rv0o2jHIuiKK6HdNetoBDuuENzfxV/x9Y+FsOsIQvVaYCt74UreCFezRCD0XfFDtFtU5g4w9JeMu2MP6tYtHomfK9ag9pyqI/FzxhTUrTY+Ej9nDEHtQqKc+Z1R/9V3KCADzQzc8nPnANFtqncsgM6cINp5/iMBdPQIaWfPoR0JoDNniAIQjA50JpawfwhnbyaXO8AkcvUAAXACC3iOHh4N+4eHgOfowdHM3JPpGPBcOTR6+xHorxSS5UxviB0KuyidmqwrPQnPFaWnRk3tb1xJz1WtB0L0XNF62o0jjwHvhvnOzBVU6l+slx/IFt9zMkdXdLF8wa+OYFSb1lnfwxeEc1fgKTLYsR4vkFfCYp64s4mVE8R63veC8eeAPjlz/1A5RKwXEF1id8IFHe3a5iPAc8Vy1q/aPQI8ZwxnaFVrEp4rhjM8yeMsCedIeVs3YKoWjPWc2xXmM7lwF+llb2KfOz0SUJ+t3eleogZgOtYDMG65bx1oRRt/ErJ2xgJUs23WhS+l54oJqN/8JGd6N2LrxkuWRA7VvEDbv+8YuiKHbWgG4ZitydxVEbR/CWmDzxXpA1exMWYx42nVi5sEO9YzIRMs1oGD4BV5yWxF+EKI4yMn7kRVldSIdaCyWRIWUonSXuluUuxb39iez5hD+JRqXvv4CI7RGQlcie33oF3MFADRRF6KcwQguAtd3pK66xtbjwym9JyxCqGVok5x6Ir5osYE29bDqlP8kzoCD5zVMmUvaOBOQFXhZ78iQbyfH7t0DVhpX2vd+dgBdPTosF/YJufMhc7IXxua2bzB54r0dXSnsh4HnzOVHdDusG7weS4XJYCQwZUzClB13CBYMCtn9J96gxXABk78Z3eErw9O+CQ+R6WvBUDzSXzOnL5K9137zm+Kz5XKSnC3WDf4nLm7r9ygtp5I3+BzpQlgF1zINMXnSgNA9eiwfvLeh0RAQncMOzp20H7C6IEsqexe4tSdOAWilfjfDxKcDjinP2Q7/ItA1rRFjvA7mHvyFQ9ErF8LHHtB5zhyJVOu3oL7it2SA7Hbc1d45XDS5sFL7PGlI8h2MmUb2aMjvPKoa86Bl+fMlgTCiyXVlsyIrNqSmXg9EnfsCqW1knG74gwvFnjhTL2dYoYZN1zP3KlxUkXrK16SJis+Ixx5S3cGuO/r+6+1idNjRnASvyIPB+6kUjvWoTH2jAbhXNoWAg91S+aUM9O4SpNNue7Ep8OuTC9XujN8bZSLJrJoSV29JvGlWgc9XAzHaLh053aTWh78pcmHesgSzknov6Lzn/4Sh+4YaIqsGbdnh0kkFuBKJFa10b6STdbCNWIvYRRjyl0lZlzARpyGz2nMnyXi0KSumGk7X8neqTnaJkumLHHm6GxYPjrPA/JDXmt1hFdHNc2M+wLnkfjUDhFTL1J/paIjH2BIngWuUFNOAfP78o3avTOOpmKamd+aCWeOsOopVxSMB7LPf1JnQthKAMO4RXYlzFc/cQVXu2f7iLxiMXEl1qOW+tiBha7DJ8ZXTl1wUZquGz8hr1crKl6ukGVA9kvK3LmNYTvl+x5awxFobdvVUXIIhzPx624Od/U0aUVxml+SIR9HK437X7njrUVtnEQkWblCK4eeFlq0bhmaYC4Di64Qs51V2uJy5qTs5jAGJxdgrpyS1k2LiSSDvj8J8198QmeLyixsTYfOyTzam+vBEpIlPpwjuLq2I2OytMeZZKUiW8ZtMM+p1K7tOzZTKryiGI2xv6TOtKDsWY8nbrFNEu4vceQKN+t7c5qEoTNxWOsJkfu1W2Uqii7Tk6726P8D';
15
16	/**
17	 * Overrides gear image URL.
18	 */
19	Sidebar.prototype.gearImage = GRAPH_IMAGE_PATH + '/clipart/Gear_128x128.png';
20
21	/**
22	 * Aliases for IDs in the libs parameter.
23	 */
24	Sidebar.prototype.libAliases = {'aws2': 'aws3', 'gcp' : 'gcp2'};
25
26	/**
27	 *
28	 */
29	Sidebar.prototype.defaultEntries = 'general;uml;er;bpmn;flowchart;basic;arrows2';
30
31	/**
32	 * Library definitions
33	 */
34	Sidebar.prototype.signs = ['Animals', 'Food', 'Healthcare', 'Nature', 'People', 'Safety', 'Science', 'Sports', 'Tech', 'Transportation', 'Travel'];
35
36	Sidebar.prototype.ibm = ['Analytics', 'Applications', 'Blockchain', 'Data', 'DevOps', 'Infrastructure', 'Management', 'Miscellaneous', 'Security', 'Social', 'Users', 'VPC', 'Boxes', 'Connectors'];
37
38	Sidebar.prototype.allied_telesis = ['Buildings', 'Computer and Terminals', 'Media Converters', 'Security', 'Storage', 'Switch', 'Wireless'];
39
40	Sidebar.prototype.gcp = ['Cards', 'Big Data', 'Compute', 'Developer Tools', 'Extras', 'Identity and Security', 'Machine Learning', 'Management Tools', 'Networking', 'Storage Databases'];
41
42	Sidebar.prototype.gcp2 = ['Paths', 'Zones', 'Service Cards', 'Compute', 'API Management', 'Security', 'Data Analytics', 'Data Transfer', 'Cloud AI', 'Internet of Things', 'Databases', 'Storage', 'Management Tools', 'Networking', 'Developer Tools', 'Expanded Product Cards', 'User Device Cards', 'Product Cards', 'General Icons', 'Icons AI Machine Learning', 'Icons Compute', 'Icons Data Analytics', 'Icons Management Tools', 'Icons Networking', 'Icons Developer Tools', 'Icons API Management', 'Icons Internet of Things', 'Icons Databases', 'Icons Storage', 'Icons Security', 'Icons Migration', 'Icons Hybrid and Multi Cloud'];
43
44	Sidebar.prototype.gcp3 = ['API Platform Ecosystems', 'Big Data', 'Cloud AI', 'Compute', 'Data Transfer', 'Developer Tools', 'Expanded Product Card Icons', 'Generic', 'Identity and Security', 'Internet of Things', 'Management Tools', 'Networking', 'Open Source Icons', 'Storage Databases'];
45
46    Sidebar.prototype.rack = ['General', 'APC', 'Cisco', 'Dell', 'F5', 'HP', 'HPE Aruba Gateways Controllers', 'HPE Aruba Security', 'HPE Aruba Switches', 'IBM', 'Oracle'];
47
48	Sidebar.prototype.pids = ['Agitators', 'Apparatus Elements', 'Centrifuges', 'Compressors', 'Compressors ISO', 'Crushers Grinding',
49                              'Driers', 'Engines', 'Feeders', 'Filters', 'Fittings', 'Flow Sensors', 'Heat Exchangers', 'Instruments', 'Misc',
50                              'Mixers', 'Piping', 'Pumps', 'Pumps DIN', 'Pumps ISO', 'Separators', 'Shaping Machines', 'Valves', 'Vessels'];
51
52	Sidebar.prototype.cisco = ['Buildings', 'Computers and Peripherals', 'Controllers and Modules', 'Directors', 'Hubs and Gateways', 'Misc',
53	                           'Modems and Phones', 'People', 'Routers', 'Security', 'Servers', 'Storage', 'Switches', 'Wireless'];
54
55	Sidebar.prototype.cisco19 = ['LAN Switching', 'Routing WAN', 'Network Management', 'Data Center', 'Wireless LAN', 'Collaboration', 'Security Clouds Connectors', 'Endpoint Client Device Icons', 'DNA SD Access', 'SD WAN Viptela', 'ETA Stealthwatch', 'SAFE'];
56
57	Sidebar.prototype.cisco_safe = ['Architecture', 'Business Icons', 'Capability', 'Design', 'IoT Things Icons', 'People Places Things Icons', 'Security Icons', 'Technology Icons', 'Threat'];
58
59	Sidebar.prototype.sysml = ['Model Elements', 'Blocks', 'Ports and Flows', 'Constraint Blocks', 'Activities', 'Interactions', 'State Machines',
60	                           'Use Cases', 'Allocations', 'Requirements', 'Profiles', 'Stereotypes'];
61
62	Sidebar.prototype.eip = ['Message Construction', 'Message Routing', 'Message Transformation', 'Messaging Channels', 'Messaging Endpoints',
63	                         'Messaging Systems', 'System Management'];
64
65	Sidebar.prototype.gmdl = ['Bottom Navigation', 'Bottom Sheets', 'Buttons', 'Cards', 'Chips', 'Dialogs', 'Dividers', 'Grid Lists', 'Icons', 'Lists', 'Menus', 'Misc', 'Pickers',
66	                          'Selection Controls', 'Sliders', 'Steppers', 'Tabs', 'Text Fields'];
67
68	Sidebar.prototype.aws2 = ['Analytics', 'Application Services', 'Compute', 'Database', 'Developer Tools', 'Enterprise Applications', 'Game Development', 'General', 'Internet of Things',
69	                          'Management Tools', 'Mobile Services', 'Networking', 'On-Demand Workforce', 'SDKs', 'Security and Identity', 'Storage and Content Delivery', 'Groups'];
70
71	Sidebar.prototype.aws3 = ['Analytics', 'Application Services', 'Artificial Intelligence', 'Business Productivity', 'Compute', 'Contact Center', 'Database', 'Desktop and App Streaming', 'Developer Tools',
72	                          'Game Development', 'General', 'Groups', 'Internet of Things',
73	                          'Management Tools', 'Messaging', 'Migration', 'Mobile Services', 'Networking and Content Delivery', 'On Demand Workforce', 'SDKs', 'Security Identity and Compliance', 'Storage'];
74
75	Sidebar.prototype.aws4b = ['Arrows', 'General Resources', 'Illustrations', 'Groups Light', 'Groups Dark', 'Analytics', 'Application Integration', 'AR VR', 'Cost Management', 'Business Productivity', 'Compute', 'Customer Engagement',
76							  'Database', 'Desktop App Streaming', 'Developer Tools', 'Game Development', 'Internet of Things', 'IoT Things', 'IoT Resources', 'Machine Learning', 'Management Tools',
77							  'Media Services', 'Migration', 'Mobile Services', 'Network Content Delivery', 'Security Identity Compliance', 'Storage'];
78
79	Sidebar.prototype.aws4 = ['Arrows', 'General Resources', 'Illustrations', 'Groups', 'Analytics', 'Application Integration', 'AR VR', 'Cost Management', 'Blockchain',
80							  'Business Applications', 'Compute', 'Containers', 'Customer Enablement', 'Customer Engagement',
81							  'Database', 'Developer Tools', 'End User Computing', 'Front End Web Mobile', 'Game Tech', 'Internet of Things', 'IoT Things', 'IoT Resources', 'Machine Learning', 'Management Governance',
82							  'Media Services', 'Migration Transfer', 'Network Content Delivery', 'Quantum Technologies', 'Robotics', 'Satellite', 'Serverless', 'Security Identity Compliance', 'Storage'];
83
84	Sidebar.prototype.office = ['Clouds', 'Communications', 'Concepts', 'Databases', 'Devices', 'Security', 'Servers', 'Services', 'Sites', 'Users'];
85
86	Sidebar.prototype.veeam = ['Data Center', 'Misc', 'Software', 'Storage', 'UsersStatus', 'VASComponents', 'Backup Replication', 'Products', 'VMs and Tape', '2D', '3D'];
87	Sidebar.prototype.veeam2 = ['Auxiliary', 'Data Center', 'Features', 'General', 'Products and Components', 'Software', 'States', 'Storage', '3D'];
88
89	Sidebar.prototype.archimate3 = ['Application', 'Business', 'Composite', 'Implementation and Migration', 'Motivation', 'Physical', 'Relationships', 'Strategy', 'Technology'];
90
91	Sidebar.prototype.electrical = ['LogicGates', 'Resistors', 'Capacitors', 'Inductors', 'SwitchesRelays', 'Diodes', 'Sources', 'Transistors', 'Misc', 'Audio', 'PlcLadder', 'Abstract', 'Optical', 'VacuumTubes', 'Waveforms', 'Instruments', 'RotMech', 'Transmission'];
92
93	/**
94	 * Description of custom libraries, see https://www.diagrams.net/doc/faq/configure-diagram-editor
95	 */
96	Sidebar.prototype.customEntries = null;
97
98	/**
99	 * Array of strings for the built-in libraries to be enabled in the more shapes dialog. Null means all,
100	 * empty array means none, possible keys are listed for the libs parameter at
101	 *
102	 * https://www.diagrams.net/doc/faq/supported-url-parameters
103	 */
104	Sidebar.prototype.enabledLibraries = null;
105
106	/**
107	 * Maximum number of custom libraries to preload into the search index.
108	 */
109	Sidebar.prototype.maxPreloadCount = 20;
110
111	/**
112	 *
113	 */
114	Sidebar.prototype.configuration = [{id: 'general', libs: ['general', 'misc', 'advanced']},
115									   {id: 'uml'}, {id: 'uml25'}, {id: 'search'}, {id: 'er'},
116									   {id: 'azure2', prefix: 'azure2', libs: ['AI Machine Learning', 'Analytics', 'App Services', 'Azure Stack', 'Azure VMware Solution', 'Blockchain', 'Compute', 'Containers', 'CXP', 'Databases', 'DevOps', 'General', 'Identity', 'Integration', 'Internet of Things', 'Intune', 'IoT', 'Management Governance', 'Migrate', 'Mixed Reality', 'Monitor', 'Networking', 'Other', 'Preview', 'Security', 'Storage', 'Web']},
117	                                   {id: 'ios', prefix: 'ios', libs: [''/*prefix is library*/, '7icons', '7ui']},
118	                                   {id: 'android', prefix: 'android', libs: [''/*prefix is library*/]}, {id: 'aws3d'},
119	                                   {id: 'flowchart'}, {id: 'basic'}, {id: 'infographic'}, {id: 'arrows'}, {id: 'arrows2'}, {id: 'lean_mapping'}, {id: 'citrix'}, {id: 'azure'}, {id: 'network'}, {id: 'vvd'},
120	                                   {id: 'sitemap'}, {id:'c4'}, {id: 'dfd'}, {id: 'threatModeling'}, {id : 'kubernetes'}, {id : 'cisco19', prefix: 'cisco19', libs: Sidebar.prototype.cisco19},
121	                                   {id: 'mscae', prefix: 'mscae', libs: ['Companies', 'EnterpriseFlat', 'IntuneFlat', 'OMSFlat', 'System CenterFlat', 'AI and ML Service', 'Analytics Service', 'Compute Service', 'Compute Service VM', 'Container Service', 'Databases Service', 'DevOps Service', 'General Service', 'Identity Service', 'Integration Service', 'Internet of Things Service', 'Intune Service', 'Management and Governance Service', 'Management and Governance Service Media', 'Migrate Service', 'Mixed Reality Service', 'Mobile Service', 'Networking Service', 'Other Category Service', 'Security Service', 'Storage Service', 'Web Service']},
122	                                   {id: 'active_directory'},
123	                                   {id: 'bpmn2', prefix: 'bpmn2', libs: ['General', 'Tasks', 'Choreographies', 'Events', 'Gateways']},
124	                                   {id: 'clipart', prefix: null, libs: ['computer', 'finance', 'clipart', 'networking', 'people', 'telco']},
125	                                   {id: 'ibm', prefix: 'ibm', libs: Sidebar.prototype.ibm},
126	                                   {id: 'allied_telesis', prefix: 'allied_telesis', libs: Sidebar.prototype.allied_telesis},
127	                                   {id: 'cumulus', libs: ['cumulus']},
128	                                   {id: 'eip', prefix: 'eip', libs: Sidebar.prototype.eip},
129	                                   {id: 'mockups', prefix: 'mockup', libs: ['Buttons', 'Containers', 'Forms', 'Graphics', 'Markup', 'Misc', 'Navigation', 'Text']},
130	                                   {id: 'pid2', prefix: 'pid2', libs: ['Agitators', 'Apparatus Elements', 'Centrifuges', 'Compressors', 'Compressors ISO', 'Crushers Grinding',
131	                                          	                          'Driers', 'Engines', 'Feeders', 'Filters', 'Fittings', 'Flow Sensors', 'Heat Exchangers', 'Instruments', 'Misc',
132	                                        	                          'Mixers', 'Piping', 'Pumps', 'Pumps DIN', 'Pumps ISO', 'Separators', 'Shaping Machines', 'Valves', 'Vessels']},
133           	                           {id: 'signs', prefix: 'signs', libs: Sidebar.prototype.signs},
134           	                           {id: 'gcp', prefix: 'gcp', libs: Sidebar.prototype.gcp},
135           	                           {id: 'gcp2', prefix: 'gcp2', libs: Sidebar.prototype.gcp2},
136           	                           {id: 'gcp3', prefix: 'gcp3', libs: Sidebar.prototype.gcp3},
137           	                           {id: 'rack', prefix: 'rack', libs: Sidebar.prototype.rack},
138           	                           {id: 'electrical', prefix: 'electrical', libs: Sidebar.prototype.electrical},
139           	                           {id: 'aws2', prefix: 'aws2', libs: Sidebar.prototype.aws2},
140           	                           {id: 'aws3', prefix: 'aws3', libs: Sidebar.prototype.aws3},
141           	                           {id: 'aws4b', prefix: 'aws4b', libs: Sidebar.prototype.aws4b},
142           	                           {id: 'aws4', prefix: 'aws4', libs: Sidebar.prototype.aws4},
143           	                           {id: 'pid', prefix: 'pid', libs: Sidebar.prototype.pids},
144           	                           {id: 'cisco', prefix: 'cisco', libs: Sidebar.prototype.cisco},
145           	                           {id: 'cisco_safe', prefix: 'cisco_safe', libs: Sidebar.prototype.cisco_safe},
146           	                           {id: 'office', prefix: 'office', libs: Sidebar.prototype.office},
147           	                           {id: 'veeam', prefix: 'veeam', libs: Sidebar.prototype.veeam},
148           	                           {id: 'veeam2', prefix: 'veeam2', libs: Sidebar.prototype.veeam2},
149           	                           {id: 'cabinets', libs: ['cabinets']},
150           	                           {id: 'floorplan', libs: ['floorplan']},
151           	                           {id: 'bootstrap', libs: ['bootstrap']},
152           	                           {id: 'atlassian', libs: ['atlassian']},
153	                                   {id: 'fluid_power', libs: ['fluid_power']},
154	                                   {id: 'gmdl', prefix: 'gmdl', libs: Sidebar.prototype.gmdl},
155           	                           {id: 'archimate3', prefix: 'archimate3', libs: Sidebar.prototype.archimate3},
156           	                           {id: 'archimate', libs: ['archimate']},
157           	                           {id: 'webicons', libs: ['webicons', 'weblogos']},
158           	                           {id: 'sysml', prefix: 'sysml', libs: Sidebar.prototype.sysml}];
159
160	/**
161	 * Adds hint for quick tutorial video for certain search terms.
162	 */
163	var siderbarInsertSearchHint = Sidebar.prototype.insertSearchHint;
164
165	Sidebar.prototype.insertSearchHint = function(div, searchTerm, count, page, results, len, more, terms)
166	{
167		if (terms != null && page == 1)
168		{
169			var hintText = null;
170
171			// Adds hint for text inserts
172			if (mxUtils.indexOf(terms, 'text') >= 0)
173			{
174				hintText = 'Double click anywhere in the diagram to insert text.';
175			}
176			else
177			{
178				// Checks if any of the following keywords are in the search terms
179				var words = ['line', 'lines', 'arrow', 'arrows', 'connect', 'connection', 'connections',
180				             'connector', 'connectors', 'curve', 'curves', 'link', 'links', 'directed',
181				             'directional', 'bidirectional'];
182
183				for (var i = 0; i < words.length; i++)
184				{
185					if (mxUtils.indexOf(terms, words[i]) >= 0)
186					{
187						hintText = 'Need help with connections?';
188						break;
189					}
190				}
191			}
192
193			if (hintText != null && !this.hideSearchHint)
194			{
195				var link = document.createElement('a');
196				link.setAttribute('href', 'https://youtu.be/Z0D96ZikMkc');
197				link.setAttribute('target', '_blank');
198				link.className = 'geTitle';
199				link.style.cssText = 'background-color:#ffd350;border-radius:6px;color:black;' +
200					'border:1px solid black !important;text-align:center;white-space:normal;' +
201					'padding:6px 0px 6px 0px !important;margin:4px 4px 8px 2px;font-size:12px;';
202				mxUtils.write(link, hintText);
203
204				// Adds close button
205				var img = document.createElement('img');
206				img.setAttribute('src', Dialog.prototype.closeImage);
207				img.setAttribute('title', mxResources.get('hide'));
208				img.className = 'geDialogClose';
209				img.style.position = 'relative';
210				img.style.cursor = 'default';
211				img.style.top = '1px';
212				img.style.right = '0px';
213
214				mxEvent.addListener(img, 'click', mxUtils.bind(this, function(evt)
215				{
216					link.parentNode.removeChild(link);
217					this.hideSearchHint = true;
218					mxEvent.consume(evt);
219				}));
220
221				link.appendChild(img);
222				div.appendChild(link);
223
224				// Shows hint only once
225				this.hideSearchHint = true;
226			}
227		}
228
229		siderbarInsertSearchHint.apply(this, arguments);
230	};
231
232	/**
233	 * Toggle palette.
234	 */
235	Sidebar.prototype.togglePalettes = function(prefix, ids)
236	{
237		this.showPalettes(prefix, ids);
238	};
239
240	/**
241	 * Toggle palette.
242	 */
243	Sidebar.prototype.togglePalette = function(id)
244	{
245		this.showPalette(id);
246	};
247
248	/**
249	 * Shows or hides palettes.
250	 */
251	Sidebar.prototype.showPalettes = function(prefix, ids, visible)
252	{
253		for (var i = 0; i < ids.length; i++)
254		{
255			this.showPalette(prefix + ids[i], visible);
256		}
257	};
258
259	/**
260	 * Shows or hides a palette.
261	 */
262	Sidebar.prototype.showPalette = function(id, visible)
263	{
264		var elts = this.palettes[id];
265
266		if (elts != null)
267		{
268			var vis = (visible != null) ? ((visible) ? 'block' : 'none') : (elts[0].style.display == 'none') ? 'block' : 'none';
269
270			for (var i = 0; i < elts.length; i++)
271			{
272				elts[i].style.display = vis;
273			}
274		}
275
276		return elts;
277	};
278
279	/**
280	 *
281	 */
282	Sidebar.prototype.getConfigurationById = function(id)
283	{
284		for (var i = 0; i < this.configuration.length; i++)
285		{
286			if (this.configuration[i].id == id)
287			{
288				return this.configuration[i];
289			}
290		}
291
292		if (this.customEntries != null)
293		{
294			for (var i = 0; i < this.customEntries.length; i++)
295			{
296				var section = this.customEntries[i];
297
298				for (var j = 0; j < section.entries.length; j++)
299				{
300					var entry = section.entries[j];
301
302					if (entry.id == id)
303					{
304						return {id: entry.id, libs: entry.libs};
305					}
306				}
307			}
308		}
309
310		return null;
311	};
312
313	/**
314	 *
315	 */
316	Sidebar.prototype.isEntryVisible = function(key)
317	{
318		var config = this.getConfigurationById(key);
319
320		if (config != null)
321		{
322			var id = (config.libs != null) ? ((config.prefix || '') + config.libs[0]) : key;
323			var elts = this.palettes[id];
324
325			if (elts != null)
326			{
327				return elts[0].style.display != 'none';
328			}
329		}
330
331		if (this.customEntries != null)
332		{
333			for (var i = 0; i < this.customEntries.length; i++)
334			{
335				var section = this.customEntries[i];
336
337				for (var j = 0; j < section.entries.length; j++)
338				{
339					var entry = section.entries[j];
340
341					if (entry.id == key)
342					{
343						if (entry.libs != null && entry.libs.length > 0)
344						{
345							var elts = this.palettes[entry.id + '.0'];
346
347							if (elts != null)
348							{
349								return elts[0].style.display != 'none';
350							}
351						}
352
353						break;
354					}
355				}
356			}
357		}
358
359		return false;
360	};
361
362	/**
363	 *
364	 */
365	Sidebar.prototype.showEntries = function(entries, remember, force)
366	{
367		var all = [];
368
369		if (remember)
370		{
371			mxSettings.setLibraries(entries);
372			mxSettings.save();
373		}
374
375		if (entries != null && (force || entries.length > 0))
376		{
377			all.push(entries);
378		}
379		else
380		{
381			var done = false;
382
383			if (urlParams['libs'] != null && urlParams['libs'].length > 0)
384			{
385				all.push(decodeURIComponent(urlParams['libs']));
386				done = this.editorUi.getServiceName() == 'draw.io';
387			}
388
389			// Libs parameter overrides configuration for online app so that
390			// links can be created to show just the specifies libraries
391			if (!done)
392			{
393				if (mxSettings != null && mxSettings.settings != null)
394				{
395					all.push(mxSettings.getLibraries());
396				}
397				else
398				{
399					all.push(this.defaultEntries);
400				}
401			}
402		}
403
404		// Merges array of semicolon separated strings into a single array
405		var temp = all.join(';').split(';');
406
407		// Resolves aliases and creates lookup
408		var visible = {};
409
410		for (var i = 0; i < temp.length; i++)
411		{
412			visible[this.libAliases[temp[i]] || temp[i]] = true;
413		}
414
415		for (var i = 0; i < this.configuration.length; i++)
416		{
417			// Search has separate switch in Extras menu
418			if (this.configuration[i].id != 'search')
419			{
420				this.showPalettes(this.configuration[i].prefix || '',
421					this.configuration[i].libs || [this.configuration[i].id],
422					visible[this.configuration[i].id] == true);
423			}
424		}
425
426		if (this.customEntries != null)
427		{
428			for (var i = 0; i < this.customEntries.length; i++)
429			{
430				var section = this.customEntries[i];
431
432				for (var j = 0; j < section.entries.length; j++)
433				{
434					var entry = section.entries[j];
435
436					if (entry.libs != null && entry.libs.length > 0)
437					{
438						var libs = [];
439
440						for (var k = 0; k < entry.libs.length; k++)
441						{
442							libs.push(entry.id + '.' + k);
443						}
444
445						this.showPalettes('', libs, visible[entry.id]);
446					}
447				}
448			}
449		}
450	};
451
452	/**
453	 * Overrides the sidebar init.
454	 */
455	Sidebar.prototype.init = function()
456	{
457		// Defines all entries for the sidebar. This is used in the MoreShapes dialog. Create screenshots using the savesidebar URL parameter and
458		// http://www.alderg.com/merge.html for creating a vertical stack of PNG images if multiple sidebars are part of an entry.
459		this.entries = [{title: mxResources.get('standard'),
460            			entries: [{title: mxResources.get('general'), id: 'general', image: IMAGE_PATH + '/sidebar-general.png'},
461            			          {title: mxResources.get('basic'), id: 'basic', image: IMAGE_PATH + '/sidebar-basic.png'},
462            			          {title: mxResources.get('arrows'), id: 'arrows2', image: IMAGE_PATH + '/sidebar-arrows2.png'},
463            			          {title: mxResources.get('clipart'), id: 'clipart', image: IMAGE_PATH + '/sidebar-clipart.png'},
464            			          {title: mxResources.get('flowchart'), id: 'flowchart', image: IMAGE_PATH + '/sidebar-flowchart.png'}]},
465            			{title: mxResources.get('software'),
466            			entries: [{title: 'Active Directory', id: 'active_directory', image: IMAGE_PATH + '/sidebar-active_directory.png'},
467            					  {title: mxResources.get('android'), id: 'android', image: IMAGE_PATH + '/sidebar-android.png'},
468            					  {title: 'Atlassian', id: 'atlassian', image: IMAGE_PATH + '/sidebar-atlassian.png'},
469            			          {title: mxResources.get('bootstrap'), id: 'bootstrap', image: IMAGE_PATH + '/sidebar-bootstrap.png'},
470            			          {title: 'C4', id: 'c4', image: IMAGE_PATH + '/sidebar-c4.png'},
471            			          {title: 'Data Flow Diagram', id: 'dfd', image: IMAGE_PATH + '/sidebar-dfd.png'},
472            			          {title: mxResources.get('entityRelation'), id: 'er', image: IMAGE_PATH + '/sidebar-er.png'},
473            			          {title: mxResources.get('ios'), id: 'ios', image: IMAGE_PATH + '/sidebar-ios.png'},
474            			          {title: mxResources.get('mockups'), id: 'mockups', image: IMAGE_PATH + '/sidebar-mockups.png'},
475            			          {title: 'Sitemap', id: 'sitemap', image: IMAGE_PATH + '/sidebar-sitemap.png'},
476            			          {title: mxResources.get('uml') + ' 2.5', id: 'uml25', image: IMAGE_PATH + '/sidebar-uml25.png'},
477            			          {title: mxResources.get('uml'), id: 'uml', image: IMAGE_PATH + '/sidebar-uml.png'}]},
478            			{title: mxResources.get('networking'),
479            			entries: [{title: 'Allied Telesis', id: 'allied_telesis', image: IMAGE_PATH + '/sidebar-allied_telesis.png'},
480            					  {title: 'AWS17', id: 'aws3', image: IMAGE_PATH + '/sidebar-aws3.png'},
481							      {title: 'AWS18', id: 'aws4b', image: IMAGE_PATH + '/sidebar-aws4b.png'},
482							      {title: 'AWS19', id: 'aws4', image: IMAGE_PATH + '/sidebar-aws4.png'},
483			            			// TODO: Add isometric containers
484            			          {title: mxResources.get('aws3d'), id: 'aws3d', image: IMAGE_PATH + '/sidebar-aws3d.png'},
485            			          {title: mxResources.get('azure'), id: 'azure2', image: IMAGE_PATH + '/sidebar-azure.png'},
486            			          {title: 'Cloud & Enterprise', id: 'mscae', image: IMAGE_PATH + '/sidebar-mscae.png'},
487            			          {title: mxResources.get('cisco'), id: 'cisco', image: IMAGE_PATH + '/sidebar-cisco.png'},
488            			          {title: 'Cisco19', id: 'cisco19', image: IMAGE_PATH + '/sidebar-cisco19.png'},
489            			          {title: 'Cisco Safe', id: 'cisco_safe', image: IMAGE_PATH + '/sidebar-cisco_safe.png'},
490            			          {title: 'Cumulus', id: 'cumulus', image: IMAGE_PATH + '/sidebar-cumulus.png'},
491            			          {title: 'Citrix', id: 'citrix', image: IMAGE_PATH + '/sidebar-citrix.png'},
492            			          {title: 'Google Cloud Platform', id: 'gcp2', image: IMAGE_PATH + '/sidebar-gcp2.png'},
493            			          {title: 'GCP Icons', id: 'gcp3', image: IMAGE_PATH + '/sidebar-gcp3.png'},
494            			          {title: 'IBM', id: 'ibm', image: IMAGE_PATH + '/sidebar-ibm.png'},
495            			          {title: 'Kubernetes', id: 'kubernetes', image: IMAGE_PATH + '/sidebar-kubernetes.png'},
496            			          {title: 'Network', id: 'network', image: IMAGE_PATH + '/sidebar-network.png'},
497            			          {title: 'Office', id: 'office', image: IMAGE_PATH + '/sidebar-office.png'},
498            			          {title: mxResources.get('rack'), id: 'rack', image: IMAGE_PATH + '/sidebar-rack.png'},
499            			          {title: 'Veeam', id: 'veeam2', image: IMAGE_PATH + '/sidebar-veeam.png'},
500            			          {title: 'VMware', id: 'vvd', image: IMAGE_PATH + '/sidebar-vvd.png'}]},
501            			{title: mxResources.get('business'),
502            			entries: [{title: 'ArchiMate 3.0', id: 'archimate3', image: IMAGE_PATH + '/sidebar-archimate3.png'},
503            			          {title: mxResources.get('archiMate21'), id: 'archimate', image: IMAGE_PATH + '/sidebar-archimate.png'},
504            			          {title: mxResources.get('bpmn') + ' 2.0', id: 'bpmn2', image: IMAGE_PATH + '/sidebar-bpmn.png'},
505            			          {title: mxResources.get('sysml'), id: 'sysml', image: IMAGE_PATH + '/sidebar-sysml.png'},
506            			          {title: 'Value Stream Mapping', id: 'lean_mapping', image: IMAGE_PATH + '/sidebar-leanmapping.png'}]},
507            			{title: mxResources.get('other'),
508            			entries: [{title: mxResources.get('cabinets'), id: 'cabinets', image: IMAGE_PATH + '/sidebar-cabinets.png'},
509            					  {title: 'Infographic', id: 'infographic', image: IMAGE_PATH + '/sidebar-infographic.png'},
510            			          {title: mxResources.get('eip'), id: 'eip', image: IMAGE_PATH + '/sidebar-eip.png'},
511            			          {title: mxResources.get('electrical'), id: 'electrical', image: IMAGE_PATH + '/sidebar-electrical.png'},
512            			          {title: mxResources.get('floorplans'), id: 'floorplan', image: IMAGE_PATH + '/sidebar-floorplans.png'},
513            			          {title: 'Fluid Power (ISO 1219)', id: 'fluid_power', image: IMAGE_PATH + '/sidebar-fluid_power.png'},
514            			          {title: mxResources.get('gmdl'), id: 'gmdl', image: IMAGE_PATH + '/sidebar-gmdl.png'},
515            			          {title: mxResources.get('procEng'), id: 'pid', image: IMAGE_PATH + '/sidebar-pid.png'},
516            			          {title: 'Threat Modeling', id: 'threatModeling', image: IMAGE_PATH + '/sidebar-threatmodeling.png'},
517            			          {title: 'Web Icons', id: 'webicons', image: IMAGE_PATH + '/sidebar-webIcons.png'},
518            			          {title: mxResources.get('signs'), id: 'signs', image: IMAGE_PATH + '/sidebar-signs.png'}]}];
519
520		// Uses search.xml index file instead (faster load times)
521		this.addStencilsToIndex = false;
522
523		// Contains additional tags for shapes
524		this.shapetags = {};
525
526		// Adds tags from compressed text file for improved searches
527		if (this.tagIndex != null)
528		{
529			this.addTagIndex(Graph.decompress(this.tagIndex));
530			this.tagIndex = null;
531		}
532
533		this.initPalettes();
534	}
535
536	/**
537	 * Overridden to add image export via servlet
538	 */
539	if (urlParams['savesidebar'] == '1')
540	{
541		Sidebar.prototype.addFoldingHandler = function(title, content, funct)
542		{
543			var initialized = false;
544
545			// Avoids mixed content warning in IE6-8
546			if (!mxClient.IS_IE || document.documentMode >= 8)
547			{
548				title.style.backgroundImage = (content.style.display == 'none') ?
549					'url(\'' + this.collapsedImage + '\')' : 'url(\'' + this.expandedImage + '\')';
550			}
551
552			title.style.backgroundRepeat = 'no-repeat';
553			title.style.backgroundPosition = '0% 50%';
554
555			var btn = document.createElement('button');
556			btn.style.marginLeft = '4px';
557			mxUtils.write(btn, 'Save');
558
559			mxEvent.addListener(title, 'click', mxUtils.bind(this, function(evt)
560			{
561				if (mxEvent.getSource(evt).nodeName == 'BUTTON')
562				{
563					var title2 = title.cloneNode(true);
564					title2.style.backgroundImage = '';
565					title2.style.textDecoration = 'none';
566					title2.style.fontWeight = 'bold';
567					title2.style.fontSize = '14px';
568					title2.style.color = 'rgb(80, 80, 80)';
569					title2.style.width = '456px';
570					title2.style.backgroundColor = '#ffffff';
571					title2.style.paddingLeft = '6px';
572
573					var btn2 = title2.getElementsByTagName('button')[0];
574					btn2.parentNode.removeChild(btn2);
575
576					var clone = content.cloneNode(true);
577					clone.style.backgroundColor = '#ffffff';
578					clone.style.borderColor = 'transparent';
579					clone.style.width = '456px';
580
581					var parser = new DOMParser();
582					var doc = parser.parseFromString('<body style="background:#ffffff;font-family:Helvetica,Arial;">' +
583							title2.outerHTML + clone.outerHTML + '</body>', 'text/html');
584
585					this.editorUi.editor.convertImages(doc.documentElement, mxUtils.bind(this, function(body)
586					{
587						var html = '<!DOCTYPE html><html><head><link rel="stylesheet" type="text/css" ' +
588							'href="https://www.draw.io/styles/grapheditor.css"></head>' +
589							mxUtils.getXml(body) + '</html>';
590
591						clone.style.position = 'absolute';
592						window.document.body.appendChild(clone);
593						var h = clone.clientHeight + 18;
594						clone.parentNode.removeChild(clone);
595
596						this.editorUi.confirm('Image data created', mxUtils.bind(this, function()
597						{
598				    		new mxXmlRequest(EXPORT_URL, 'w=456&h=' + h + '&html=' + encodeURIComponent(
599				    			Graph.compress(html))).simulate(document, '_blank');
600						}), null, mxResources.get('save'), mxResources.get('cancel'));
601					}));
602
603					return;
604				}
605
606				if (content.style.display == 'none')
607				{
608					if (!initialized)
609					{
610						initialized = true;
611
612						if (funct != null)
613						{
614							if (btn.parentNode != null)
615							{
616								btn.parentNode.removeChild(btn);
617							}
618
619							// Wait cursor does not show up on Mac
620							title.style.cursor = 'wait';
621							var prev = title.innerHTML;
622							title.innerHTML = mxResources.get('loading') + '...';
623
624							window.setTimeout(function()
625							{
626								funct(content);
627								title.style.cursor = '';
628								title.innerHTML = prev;
629								title.appendChild(btn);
630							}, 0);
631						}
632						else
633						{
634							title.appendChild(btn);
635						}
636					}
637					else
638					{
639						title.appendChild(btn);
640					}
641
642					title.style.backgroundImage = 'url(\'' + this.expandedImage + '\')';
643					content.style.display = 'block';
644				}
645				else
646				{
647					title.style.backgroundImage = 'url(\'' + this.collapsedImage + '\')';
648					content.style.display = 'none';
649
650					if (btn.parentNode != null)
651					{
652						btn.parentNode.removeChild(btn);
653					}
654				}
655
656				mxEvent.consume(evt);
657			}));
658		};
659	};
660
661	/**
662	 * Overridden to use shapetags to improve search results.
663	 */
664	Sidebar.prototype.extractShapeStyle = function(style)
665	{
666		if (style != null && style.substring(0, 6) == 'shape=')
667		{
668			var semi = style.indexOf(';');
669
670			if (semi < 0)
671			{
672				semi = style.length;
673			}
674
675			return style.substring(6, semi);
676		}
677
678		return null;
679	};
680
681	/**
682	 * Overridden to use shapetags to improve search results.
683	 */
684	var sidebarGetTagsForStencil = Sidebar.prototype.getTagsForStencil;
685
686	Sidebar.prototype.getTagsForStencil = function(pkg, stc, moreTags)
687	{
688		var tags = sidebarGetTagsForStencil.apply(this, arguments);
689
690		// Adds tags from tags file
691		if (this.shapetags != null)
692		{
693			pkg = pkg.toLowerCase();
694			stc = stc.toLowerCase();
695
696			if (this.shapetags[pkg] != null)
697			{
698				tags.push(this.shapetags[pkg]);
699			}
700
701			stc = pkg + '.' + stc;
702
703			if (this.shapetags[stc] != null)
704			{
705				tags.push(this.shapetags[stc]);
706			}
707		}
708
709		return tags;
710	};
711
712	/**
713	 * Overrides the sidebar init.
714	 */
715	Sidebar.prototype.addTagIndex = function(text)
716	{
717		var lines = text.split('\n');
718
719		for (var i = 0; i < lines.length; i++)
720		{
721			if (lines[i] != null)
722			{
723				var tags = lines[i].split('\t');
724
725				if (tags.length > 1)
726				{
727					var key = tags[0].toLowerCase().replace(' ', '_');
728					var value = mxUtils.trim(tags.slice(1, tags.length).join(' ').toLowerCase());
729
730					if (value.length > 0)
731					{
732						this.shapetags[key] = value;
733					}
734				}
735			}
736		}
737	};
738
739	/**
740	 * Adds shape search UI.
741	 */
742	Sidebar.prototype.showPopupMenuForEntry = function(elt, libs, evt)
743	{
744		if (libs != null && libs.length > 0)
745		{
746			var offset = mxUtils.getOffset(elt);
747
748			this.editorUi.showPopupMenu(mxUtils.bind(this, function(menu, parent)
749			{
750				menu.addItem(mxResources.get('openLibrary'), null, mxUtils.bind(this, function()
751				{
752					for (var i = 0; i < libs.length; i++)
753					{
754						(mxUtils.bind(this, function(lib)
755						{
756							var config = this.getConfigurationById(lib.id);
757
758							if (config != null)
759							{
760								this.showPalettes(config.prefix || '', config.libs || [config.id], true);
761								var elts = this.showPalette(libs[i].lib || libs[i].id, true);
762
763								if (elts != null && elts.length > 1 && elts[1].firstChild != null &&
764									(elts[1].firstChild.firstChild == null ||
765									elts[1].firstChild.style.display == 'none'))
766								{
767									elts[0].click();
768								}
769
770								window.setTimeout(function()
771								{
772									elts[1].scrollIntoView(true);
773								}, 0);
774
775								mxEvent.consume(evt);
776							}
777						}))(libs[i]);
778					}
779				}));
780			}), offset.x, offset.y + elt.offsetHeight, evt);
781		}
782	};
783
784	/**
785	 * Overrides the sidebar init.
786	 */
787	Sidebar.prototype.addSearchIndex = function(shapes)
788	{
789		if (shapes != null)
790		{
791			for (var i = 0; i < shapes.length; i++)
792			{
793				if (shapes[i].style != null)
794				{
795					var style = shapes[i].style;
796					var shapeStyle = this.extractShapeStyle(style);
797
798					if (shapeStyle != null)
799					{
800						var lastDot = shapeStyle.lastIndexOf('.');
801
802						if (lastDot > 0)
803						{
804							var pkg = shapeStyle.substring(0, lastDot);
805							var stc = shapeStyle.substring(lastDot + 1, shapeStyle.length);
806							var tags = this.getTagsForStencil(pkg, stc, shapes[i].tags);
807
808							// TODO: Use shapetags for programmatic stencils
809							if (tags != null)
810							{
811								// Converts stencil name to lowercase
812								var semi = style.indexOf(';');
813								style = 'shape=' + pkg + '.' + stc.toLowerCase() + ';' +
814									((semi < 0) ? '' : style.substring(semi + 1));
815								this.setCurrentSearchEntryLibrary(shapes[i].id, shapes[i].lib);
816								this.createVertexTemplateEntry(style, parseInt(shapes[i].w),
817										parseInt(shapes[i].h), '', stc.replace(/_/g, ' '),
818										null, null, this.filterTags(tags.join(' ')));
819								this.setCurrentSearchEntryLibrary();
820							}
821						}
822					}
823				}
824			}
825		}
826	};
827
828	/**
829	 * Overrides the sidebar init.
830	 */
831	Sidebar.prototype.initPalettes = function()
832	{
833		var imgDir = GRAPH_IMAGE_PATH;
834		var dir = STENCIL_PATH;
835		var signs = this.signs;
836		var rack = this.rack;
837		var pids = this.pids;
838		var cisco = this.cisco;
839		var sysml = this.sysml;
840
841		if (urlParams['createindex'] == '1')
842		{
843			this.createdSearchIndex = [];
844		}
845
846		this.addSearchPalette(true);
847
848		// Adds custom sections first
849		if (this.customEntries != null)
850		{
851			var preloadCount = 0;
852
853			for (var i = 0; i < this.customEntries.length; i++)
854			{
855				var section = this.customEntries[i];
856
857				for (var j = 0; j < section.entries.length; j++)
858				{
859					var entry = section.entries[j];
860
861					for (var k = 0; k < entry.libs.length; k++)
862					{
863						(mxUtils.bind(this, function(lib)
864						{
865							var data = null;
866							var error = null;
867							var content = null;
868							var title = null;
869
870							var showError = mxUtils.bind(this, function(err, c)
871							{
872								var div = document.createElement('span');
873								div.style.paddingBottom = '6px';
874								div.style.paddingTop = '6px';
875								div.style.fontSize = '11px';
876								mxUtils.write(div, err);
877								c.innerHTML = '<img align="top" src="' + mxGraph.prototype.warningImage.src + '"/> ';
878								c.appendChild(div);
879							});
880
881							var barrier = mxUtils.bind(this, function()
882							{
883								if (content != null && title != null)
884								{
885									if (error != null)
886									{
887										content.style.display = 'block';
888										title.innerHTML = '';
889										mxUtils.write(title, this.editorUi.getResource(lib.title));
890										showError(error, content);
891									}
892									else if (data != null)
893									{
894										this.editorUi.addLibraryEntries(data, content);
895										content.style.display = 'block';
896										title.innerHTML = '';
897										mxUtils.write(title, this.editorUi.getResource(lib.title));
898									}
899									else
900									{
901										content.style.display = 'none';
902										title.innerHTML = '';
903										mxUtils.write(title, mxResources.get('loading') + '...');
904									}
905								}
906							});
907
908							if (lib.data == null && lib.url != null && (!lib.preload && preloadCount >= this.maxPreloadCount))
909							{
910								this.addPalette(entry.id + '.' + k, this.editorUi.getResource(lib.title),
911									false, mxUtils.bind(this, function(content, title)
912								{
913									var dataLoaded = mxUtils.bind(this, function(images)
914									{
915										this.setCurrentSearchEntryLibrary(entry.id, entry.id + '.' + k);
916										this.addEntries(images);
917										this.setCurrentSearchEntryLibrary();
918										this.editorUi.addLibraryEntries(images, content);
919									});
920
921									content.style.display = 'none';
922									title.innerHTML = '';
923									mxUtils.write(title, mxResources.get('loading') + '...');
924
925									var url = lib.url;
926
927									if (!this.editorUi.editor.isCorsEnabledForUrl(url))
928									{
929										url = PROXY_URL + '?url=' + encodeURIComponent(url);
930									}
931
932									this.editorUi.editor.loadUrl(url, mxUtils.bind(this, function(data)
933									{
934										content.style.display = 'block';
935										title.innerHTML = '';
936										mxUtils.write(title, this.editorUi.getResource(lib.title));
937
938										try
939										{
940											var doc = mxUtils.parseXml(data);
941
942											if (doc.documentElement.nodeName == 'mxlibrary')
943											{
944												var images = JSON.parse(mxUtils.getTextContent(doc.documentElement));
945												dataLoaded(images);
946											}
947											else
948											{
949												showError(mxResources.get('notALibraryFile'), content);
950											}
951										}
952										catch (e)
953										{
954											showError(mxResources.get('error') + ': ' + e.message, content);
955										}
956									}));
957								}));
958							}
959							else
960							{
961								this.addPalette(entry.id + '.' + k, this.editorUi.getResource(lib.title),
962									false, mxUtils.bind(this, function(c, t)
963								{
964									content = c;
965									title = t;
966									barrier();
967								}));
968
969								if (lib.data != null)
970								{
971									this.setCurrentSearchEntryLibrary(entry.id, entry.id + '.' + k);
972									this.addEntries(lib.data);
973									this.setCurrentSearchEntryLibrary();
974									data = lib.data;
975									barrier();
976								}
977								else if (lib.url != null)
978								{
979									preloadCount++;
980									var url = lib.url;
981
982									if (!this.editorUi.editor.isCorsEnabledForUrl(url))
983									{
984										url = PROXY_URL + '?url=' + encodeURIComponent(url);
985									}
986
987									this.editorUi.editor.loadUrl(url, mxUtils.bind(this, function(temp)
988									{
989										try
990										{
991											var doc = mxUtils.parseXml(temp);
992
993											if (doc.documentElement.nodeName == 'mxlibrary')
994											{
995												data = JSON.parse(mxUtils.getTextContent(doc.documentElement));
996												this.addEntries(data);
997												barrier();
998											}
999											else
1000											{
1001												error = mxResources.get('notALibraryFile');
1002												barrier();
1003											}
1004										}
1005										catch (e)
1006										{
1007											error = mxResources.get('error') + ': ' + e.message;
1008											barrier();
1009										}
1010									}), mxUtils.bind(this, function(e)
1011									{
1012										error = (e != null && e.message != null) ? e.message : e;
1013										barrier();
1014									}));
1015								}
1016								else
1017								{
1018									error = mxResources.get('invalidInput');
1019									barrier();
1020								}
1021							}
1022						}))(entry.libs[k]);
1023					}
1024				}
1025			}
1026		}
1027
1028		this.addGeneralPalette(this.customEntries == null);
1029		this.addMiscPalette(false);
1030		this.addAdvancedPalette(false);
1031		this.addBasicPalette();
1032		this.addStencilPalette('arrows', mxResources.get('arrows'), dir + '/arrows.xml',
1033				';html=1;' + mxConstants.STYLE_VERTICAL_LABEL_POSITION + '=bottom;' + mxConstants.STYLE_VERTICAL_ALIGN + '=top;' + mxConstants.STYLE_STROKEWIDTH + '=2;strokeColor=#000000;',
1034				null, null, null, null, null, 'arrows');
1035		this.addArrows2Palette();
1036
1037		this.setCurrentSearchEntryLibrary('clipart', 'computer');
1038		this.addImagePalette('computer', 'Clipart / Computer', imgDir
1039				+ '/lib/clip_art/computers/', '_128x128.png', ['Antivirus',
1040				'Data_Filtering', 'Database', 'Database_Add', 'Database_Minus',
1041				'Database_Move_Stack', 'Database_Remove', 'Fujitsu_Tablet',
1042				'Harddrive', 'IBM_Tablet', 'iMac', 'iPad', 'Laptop', 'MacBook',
1043				'Mainframe', 'Monitor', 'Monitor_Tower',
1044				'Monitor_Tower_Behind', 'Netbook', 'Network', 'Network_2',
1045				'Printer', 'Printer_Commercial', 'Secure_System', 'Server',
1046				'Server_Rack', 'Server_Rack_Empty', 'Server_Rack_Partial',
1047				'Server_Tower', 'Software', 'Stylus', 'Touch', 'USB_Hub',
1048				'Virtual_Application', 'Virtual_Machine', 'Virus',
1049				'Workstation' ], [ 'Antivirus', 'Data Filtering', 'Database',
1050	            'Database Add', 'Database Minus', 'Database Move Stack',
1051	            'Database Remove', 'Fujitsu Tablet', 'Harddrive', 'IBMTablet',
1052	            'iMac', 'iPad', 'Laptop', 'MacBook', 'Mainframe', 'Monitor',
1053	            'Monitor Tower', 'Monitor Tower Behind', 'Netbook', 'Network',
1054	            'Network 2', 'Printer', 'Printer Commercial', 'Secure System',
1055	            'Server', 'Server Rack', 'Server Rack Empty', 'Server Rack Partial',
1056	            'Server Tower', 'Software', 'Stylus', 'Touch', 'USB Hub',
1057	            'Virtual Application', 'Virtual Machine', 'Virus', 'Workstation']);
1058
1059		this.setCurrentSearchEntryLibrary('clipart', 'finance');
1060		this.addImagePalette('finance', 'Clipart / Finance', imgDir
1061				+ '/lib/clip_art/finance/', '_128x128.png', [ 'Arrow_Down',
1062				'Arrow_Up', 'Coins', 'Credit_Card', 'Dollar', 'Graph',
1063				'Pie_Chart', 'Piggy_Bank', 'Safe', 'Shopping_Cart',
1064				'Stock_Down', 'Stock_Up'], ['Arrow_Down', 'Arrow Up',
1065	            'Coins', 'Credit Card', 'Dollar', 'Graph', 'Pie Chart',
1066	            'Piggy Bank', 'Safe', 'Shopping Basket', 'Stock Down', 'Stock Up']);
1067
1068		this.setCurrentSearchEntryLibrary('clipart', 'clipart');
1069		this.addImagePalette('clipart', 'Clipart / Various', imgDir
1070				+ '/lib/clip_art/general/', '_128x128.png', [ 'Battery_0',
1071				'Battery_100', 'Battery_50', 'Battery_75', 'Battery_allstates',
1072				'Bluetooth', 'Earth_globe', 'Empty_Folder', 'Full_Folder',
1073				'Gear', 'Keys', 'Lock', 'Mouse_Pointer', 'Plug', 'Ships_Wheel',
1074				'Star', 'Tire' ], [ 'Battery 0%', 'Battery 100%', 'Battery 50%',
1075	            'Battery 75%', 'Battery', 'Bluetooth', 'Globe',
1076	            'Empty Folder', 'Full Folder', 'Gear', 'Keys', 'Lock', 'Mousepointer',
1077	            'Plug', 'Ships Wheel', 'Star', 'Tire']);
1078
1079		this.setCurrentSearchEntryLibrary('clipart', 'networking');
1080		this.addImagePalette('networking', 'Clipart / Networking', imgDir
1081				+ '/lib/clip_art/networking/', '_128x128.png', ['Bridge',
1082				'Certificate', 'Certificate_Off', 'Cloud', 'Cloud_Computer',
1083				'Cloud_Computer_Private', 'Cloud_Rack', 'Cloud_Rack_Private',
1084				'Cloud_Server', 'Cloud_Server_Private', 'Cloud_Storage',
1085				'Concentrator', 'Email', 'Firewall_02', 'Firewall',
1086				'Firewall-page1', 'Ip_Camera', 'Modem',
1087				'power_distribution_unit', 'Print_Server',
1088				'Print_Server_Wireless', 'Repeater', 'Router', 'Router_Icon',
1089				'Switch', 'UPS', 'Wireless_Router', 'Wireless_Router_N'],
1090				['Bridge', 'Certificate', 'Certificate Off', 'Cloud', 'Cloud Computer',
1091				'Cloud Computer Private', 'Cloud Rack', 'Cloud Rack Private',
1092				'Cloud Server', 'Cloud Server Private', 'Cloud Storage',
1093				'Concentrator', 'Email', 'Firewall 1', 'Firewall 2',
1094				'Firewall', 'Camera', 'Modem',
1095				'Power Distribution Unit', 'Print Server',
1096				'Print Server Wireless', 'Repeater', 'Router', 'Router Icon',
1097				'Switch', 'UPS', 'Wireless Router', 'Wireless Router N'],
1098				 {'Wireless_Router': 'wireless router switch wap wifi access point wlan',
1099				  'Wireless_Router_N': 'wireless router switch wap wifi access point wlan',
1100				  'Router': 'router switch',
1101				  'Router_Icon': 'router switch'});
1102
1103		this.setCurrentSearchEntryLibrary('clipart', 'people');
1104		this.addImagePalette('people', 'Clipart / People', imgDir
1105				+ '/lib/clip_art/people/', '_128x128.png', ['Suit_Man',
1106				'Suit_Man_Black', 'Suit_Man_Blue', 'Suit_Man_Green',
1107				'Suit_Man_Green_Black', 'Suit_Woman', 'Suit_Woman_Black',
1108				'Suit_Woman_Blue', 'Suit_Woman_Green',
1109				'Suit_Woman_Green_Black', 'Construction_Worker_Man',
1110				'Construction_Worker_Man_Black', 'Construction_Worker_Woman',
1111				'Construction_Worker_Woman_Black', 'Doctor_Man',
1112				'Doctor_Man_Black', 'Doctor_Woman', 'Doctor_Woman_Black',
1113				'Farmer_Man', 'Farmer_Man_Black', 'Farmer_Woman',
1114				'Farmer_Woman_Black', 'Nurse_Man', 'Nurse_Man_Black',
1115				'Nurse_Woman',
1116				'Nurse_Woman_Black',
1117				'Military_Officer', 'Military_Officer_Black',
1118				'Military_Officer_Woman', 'Military_Officer_Woman_Black',
1119				'Pilot_Man', 'Pilot_Man_Black', 'Pilot_Woman',
1120				'Pilot_Woman_Black', 'Scientist_Man', 'Scientist_Man_Black',
1121				'Scientist_Woman', 'Scientist_Woman_Black', 'Security_Man',
1122				'Security_Man_Black', 'Security_Woman', 'Security_Woman_Black',
1123				'Tech_Man', 'Tech_Man_Black',
1124				'Telesales_Man', 'Telesales_Man_Black', 'Telesales_Woman',
1125				'Telesales_Woman_Black', 'Waiter', 'Waiter_Black',
1126				'Waiter_Woman', 'Waiter_Woman_Black', 'Worker_Black',
1127				'Worker_Man', 'Worker_Woman', 'Worker_Woman_Black']);
1128
1129		this.setCurrentSearchEntryLibrary('clipart', 'telco');
1130		this.addImagePalette('telco', 'Clipart / Telecommunication', imgDir
1131				+ '/lib/clip_art/telecommunication/', '_128x128.png', [
1132				'BlackBerry', 'Cellphone', 'HTC_smartphone', 'iPhone',
1133				'Palm_Treo', 'Signal_tower_off', 'Signal_tower_on' ],
1134				['BlackBerry', 'Cellphone', 'HTC smartphone', 'iPhone',
1135				  'Palm Treo', 'Signaltower off', 'Signaltower on']);
1136		this.setCurrentSearchEntryLibrary();
1137
1138		this.addFlowchartPalette();
1139		this.addActiveDirectoryPalette();
1140		this.addAndroidPalette();
1141		this.addAtlassianPalette();
1142		this.addBootstrapPalette();
1143		this.addDFDPalette();
1144		this.addErPalette();
1145		this.addIos7Palette();
1146		this.addIosPalette();
1147		this.addKubernetesPalette();
1148		this.addMockupPalette();
1149		this.addSitemapPalette();
1150		this.addUml25Palette();
1151		this.addUmlPalette(false);
1152		this.addAlliedTelesisPalette();
1153		this.addAWS3Palette();
1154		this.addAWS4bPalette();
1155		this.addAWS4Palette();
1156		this.addAWS3DPalette();
1157		this.addAzurePalette();
1158		this.addAzure2Palette();
1159		this.addMSCAEPalette();
1160		this.addC4Palette();
1161		this.addCiscoPalette(cisco, dir);
1162		this.addCisco19Palette();
1163		this.addCiscoSafePalette();
1164		this.addCumulusPalette();
1165		this.addCitrixPalette();
1166		this.addGCP2Palette();
1167		this.addGCP3Palette();
1168		this.addIBMPalette();
1169		this.addNetworkPalette();
1170		this.addOfficePalette();
1171		this.addRackPalette(rack, dir);
1172		this.addVeeamPalette();
1173		this.addVeeam2Palette();
1174		this.addVVDPalette();
1175		this.addArchimate3Palette();
1176		this.addArchiMatePalette();
1177		this.addBpmn2Palette();
1178		this.addSysMLPalette(sysml, dir);
1179		this.addLeanMappingPalette();
1180		this.addCabinetsPalette();
1181		this.addInfographicPalette();
1182		this.addEipPalette();
1183		this.addElectricalPalette();
1184		this.addFloorplanPalette();
1185		this.addFluidPowerPalette();
1186		this.addGMDLPalette();
1187		this.addPidPalette(pids, dir);
1188		this.addThreatModelingPalette();
1189		this.addWebIconsPalette();
1190		this.addWebLogosPalette();
1191		this.addSignsPalette(signs, dir);
1192		// LATER: Check if conflicts with restore libs after loading file
1193		this.showEntries();
1194
1195		if (this.createdSearchIndex != null)
1196		{
1197			console.log('searchFileData', Graph.compress(JSON.stringify(this.createdSearchIndex)));
1198		}
1199	};
1200
1201	/**
1202	 * Overridden to manually create search index for stencil files which are not pre-loaded
1203	 * and no entries are created programmatically.
1204	 */
1205	if (urlParams['createindex'] == '1')
1206	{
1207		var sidebarAddStencilPalette = Sidebar.prototype.addStencilPalette;
1208
1209		Sidebar.prototype.addStencilPalette = function(id, title, stencilFile, style, ignore, onInit, scale, tags, customFns, groupId)
1210		{
1211			sidebarAddStencilPalette.apply(this, arguments);
1212			scale = (scale != null) ? scale : 1;
1213
1214			// Used for creating index
1215			mxStencilRegistry.loadStencilSet(stencilFile, mxUtils.bind(this, function(packageName, stencilName, displayName, w, h)
1216			{
1217				if (this.createdSearchIndex != null && ignore == null || mxUtils.indexOf(ignore, stencilName) < 0)
1218				{
1219					var entry = {style: 'shape=' + packageName + stencilName + style,
1220						w: Math.round(w * scale), h: Math.round(h * scale)};
1221					var tmpTags = (tags != null) ? tags[stencilName] : null;
1222
1223					if (tmpTags != null)
1224					{
1225						entry.tags = tmpTags;
1226					}
1227
1228					if (groupId != null)
1229					{
1230						entry.id = groupId;
1231						entry.lib = id;
1232					}
1233
1234					this.createdSearchIndex.push(entry);
1235				}
1236			}), true);
1237		};
1238	}
1239
1240	/**
1241	 * Extracs icons from the search result.
1242	 */
1243	Sidebar.prototype.extractIconsFromResponse = function(res, results)
1244	{
1245		for (var i = 0; i < res.icons.length; i++)
1246		{
1247			var sizes = res.icons[i].raster_sizes;
1248			var index = sizes.length - 1;
1249
1250			while (index > 0 && sizes[index].size > 128)
1251			{
1252				index--;
1253			}
1254
1255			var size = sizes[index].size;
1256			var url = sizes[index].formats[0].preview_url;
1257
1258			if (size != null && url != null)
1259			{
1260				(mxUtils.bind(this, function(s, u)
1261				{
1262					results.push(mxUtils.bind(this, function()
1263					{
1264						return this.createVertexTemplate('shape=image;html=1;verticalAlign=top;' +
1265							'verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;imageAspect=0;' +
1266							'aspect=fixed;image=' + u, s, s, '');
1267					}));
1268				}))(size, url);
1269			}
1270		}
1271	};
1272
1273	/**
1274	 * Adds server icon results to local search results
1275	 */
1276	var sidebarSearchEntries = Sidebar.prototype.searchEntries;
1277
1278	Sidebar.prototype.searchEntries = function(searchTerms, count, page, success, error)
1279	{
1280		var succ = success;
1281
1282		// Lazy-load indices
1283		if (this.searchIndexData != null)
1284		{
1285			this.addSearchIndex(JSON.parse(Graph.decompress(this.searchIndexData)));
1286			this.searchIndexData = null;
1287		}
1288
1289		if (ICONSEARCH_PATH != null)
1290		{
1291			success = mxUtils.bind(this, function(results, len, more, terms)
1292			{
1293				if (!this.editorUi.isOffline() && results.length <= count / 4)
1294				{
1295					var pg = page - Math.ceil((len - count / 4) / count);
1296
1297					mxUtils.get(ICONSEARCH_PATH + '?q=' + encodeURIComponent(searchTerms) +
1298						'&p=' + pg + '&c=' + count, mxUtils.bind(this, function(req)
1299					{
1300						try
1301						{
1302							if (req.getStatus() >= 200 && req.getStatus() <= 299)
1303							{
1304								// Ignore without error if no response
1305								if (req.getText() != null && req.getText().length > 0)
1306								{
1307									try
1308									{
1309										var res = JSON.parse(req.getText());
1310
1311										if (res == null || res.icons == null)
1312										{
1313											succ(results, len, false, terms);
1314											this.editorUi.handleError(res);
1315										}
1316										else
1317										{
1318											this.extractIconsFromResponse(res, results);
1319											succ(results, (page - 1) * count + results.length, res.icons.length == count, terms);
1320										}
1321									}
1322									catch (e)
1323									{
1324										succ(results, len, false, terms);
1325										this.editorUi.handleError(e);
1326									}
1327								}
1328								else
1329								{
1330									succ(results, len, false, terms);
1331								}
1332							}
1333							else
1334							{
1335								succ(results, len, false, terms);
1336								this.editorUi.handleError({message: mxResources.get('unknownError')});
1337							}
1338						}
1339						catch (e)
1340						{
1341							succ(results, len, false, terms);
1342							this.editorUi.handleError(e);
1343						}
1344					},
1345					function()
1346					{
1347						succ(results, len, false, terms);
1348					}));
1349				}
1350				else
1351				{
1352					succ(results, len, more || !this.editorUi.isOffline(), terms);
1353				}
1354			});
1355		}
1356
1357		sidebarSearchEntries.apply(this, arguments);
1358	};
1359
1360	/**
1361	 * Adds a click handler for inserting the cell as target for dangling edge.
1362	 */
1363	var sidebarItemClicked = Sidebar.prototype.itemClicked;
1364
1365	Sidebar.prototype.itemClicked = function(cells, ds, evt)
1366	{
1367		var graph = this.editorUi.editor.graph;
1368		var handled = false;
1369
1370		if (cells != null && graph.getSelectionCount() == 1 && graph.getModel().isVertex(cells[0]))
1371		{
1372			var target = graph.cloneCell(cells[0]);
1373
1374			// Inserts cell as target of selected edge if not connected
1375			if (graph.getModel().isEdge(graph.getSelectionCell()) && graph.getModel().getTerminal(graph.getSelectionCell(), false) == null &&
1376				graph.getModel().isVertex(target))
1377			{
1378				graph.getModel().beginUpdate();
1379				try
1380				{
1381					var edgeState = graph.view.getState(graph.getSelectionCell());
1382
1383					if (edgeState != null)
1384					{
1385						var tr = graph.view.translate;
1386						var s = graph.view.scale;
1387						var pt = edgeState.absolutePoints[edgeState.absolutePoints.length - 1];
1388
1389						target.geometry.x = pt.x / s - tr.x - target.geometry.width / 2;
1390						target.geometry.y = pt.y / s - tr.y - target.geometry.height / 2;
1391					}
1392
1393					graph.addCell(target);
1394					graph.getModel().setTerminal(graph.getSelectionCell(), target, false);
1395
1396					if (evt == null || !mxEvent.isShiftDown(evt))
1397					{
1398						graph.fireEvent(new mxEventObject('cellsInserted', 'cells', [target]));
1399					}
1400				}
1401				catch (e)
1402				{
1403					this.editorUi.handleError(e);
1404				}
1405				finally
1406				{
1407					graph.getModel().endUpdate();
1408				}
1409
1410				graph.scrollCellToVisible(target);
1411				graph.setSelectionCell(target);
1412				handled = true;
1413			}
1414		}
1415
1416		if (!handled)
1417		{
1418			sidebarItemClicked.apply(this, arguments);
1419		}
1420	};
1421})();
1422