hy-virtual-tree 1.1.42 → 1.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -73,6 +73,12 @@ var menu_acquisitionStation_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0
73
73
 
74
74
  var noData = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjhweCIgaGVpZ2h0PSI4MHB4IiB2aWV3Qm94PSIwIDAgNjggODAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICAgICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsLW9wYWNpdHk9IjAuNiI+CiAgICAgICAgPGcgaWQ9Iuagt+W8jy0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTQzOS4wMDAwMDAsIC0zNjAuMDAwMDAwKSIgZmlsbD0iIzVFOURCNCIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGcgaWQ9Im5vRGF0YSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTQzOS4wMDAwMDAsIDM2MC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00OCw1MiBDNDMuMDI5MjQ2Myw1MiAzOSw1NS44MDUzOTkzIDM5LDYwLjUgQzM5LDY1LjE5NDYwMDcgNDMuMDI5MjQ2Myw2OSA0OCw2OSBDNTIuOTcwNzUzNyw2OSA1Nyw2NS4xOTQ2MDA3IDU3LDYwLjUgQzU2Ljk4OTg3NjMsNTUuODA1Mzk5MyA1Mi45NjA2Mjk5LDUyIDQ4LDUyIFogTTYyLjEyMDUyNCwwIEw1Ljg1OTY3OTgsMCBDMi42MjI5OTg1NCwwIDAsMi41NjU3MTAxNSAwLDUuNzEwMTUxOTIgTDAsNzQuMjg5ODQ4MSBDMCw3Ny40NDM5MzU0IDIuNjMyODk2NjUsODAgNS44NTk2Nzk4LDgwIEw2Mi4xMjA1MjQsODAgQzYyLjY1NTAyMTgsODAgNjMuMTY5NzIzNCw3OS45MzI0ODEzIDYzLjY2NDYyODgsNzkuODA3MDg5NSBMNTYuMDcyNzgwMiw3Mi40MDg5NzAzIEM1My43NTY2MjMsNzMuOTEzNjcyNSA1MC45NzUyNTQ3LDc0Ljc3MjEyNDQgNDcuOTk1OTI0Myw3NC43NzIxMjQ0IEMzOS44OTkyNzIyLDc0Ljc3MjEyNDQgMzMuMzM2ODI2OCw2OC4zNzcxNDAxIDMzLjMzNjgyNjgsNjAuNDg3MDk5MSBDMzMuMzM2ODI2OCw1Mi41OTcwNTgxIDM5Ljg5OTI3MjIsNDYuMjAyMDczOCA0Ny45OTU5MjQzLDQ2LjIwMjA3MzggQzU2LjA5MjU3NjQsNDYuMjAyMDczOCA2Mi42NTUwMjE4LDUyLjU5NzA1ODEgNjIuNjU1MDIxOCw2MC40ODcwOTkxIEM2Mi42NTUwMjE4LDYzLjQwMDA0ODIgNjEuNzU0Mjk0LDY2LjEwMDc5NTggNjAuMjI5OTg1NCw2OC4zNTc4NDkgTDY3LjgxMTkzNiw3NS43NDYzMjI2IEM2Ny45NDA2MTE0LDc1LjI4MzMzNzQgNjgsNzQuNzkxNDE1NSA2OCw3NC4yODAyMDI2IEw2OCw1LjcwMDUwNjM5IEM2Ny45OTAxMDE5LDIuNTU2MDY0NjMgNjUuMzU3MjA1MiwwIDYyLjEyMDUyNCwwIFogTTMwLjEwOTExMTQsNDguMTIxMjEyMSBDMjkuNTYyNDI5Nyw0OC42NjY2NjY3IDI4LjgxMzI3MzMsNDkgMjcuOTkzMjUwOCw0OSBMMTUuOTk2NjI1NCw0OC45Nzk3OTggQzE0LjM0NjQ1NjcsNDguOTc5Nzk4IDEzLDQ3LjYzNjM2MzYgMTMsNDUuOTg5ODk5IEMxMyw0NS4xNzE3MTcyIDEzLjMzNDA4MzIsNDQuNDE0MTQxNCAxMy44ODA3NjQ5LDQzLjg3ODc4NzkgQzE0LjQyNzQ0NjYsNDMuMzMzMzMzMyAxNS4xNzY2MDI5LDQzIDE1Ljk5NjYyNTQsNDMgTDI4LjAwMzM3NDYsNDMuMDIwMjAyIEMyOS42NTM1NDMzLDQzLjAyMDIwMiAzMSw0NC4zNjM2MzY0IDMxLDQ2LjAxMDEwMSBDMzAuOTg5ODc2Myw0Ni44MjgyODI4IDMwLjY0NTY2OTMsNDcuNTc1NzU3NiAzMC4xMDkxMTE0LDQ4LjEyMTIxMjEgTDMwLjEwOTExMTQsNDguMTIxMjEyMSBaIE01My4xMzk4NjAxLDMyLjExODI0MzIgQzUyLjYwNTk4MDIsMzIuNjY1NTQwNSA1MS44NzQzNjcsMzMgNTEuMDczNTQ3MSwzMyBMMTUuOTI2NDUyOSwzMyBDMTQuMzE0OTI2NSwzMyAxMywzMS42NTIwMjcgMTMsMzAgQzEzLDI5LjE3OTA1NDEgMTMuMzI2MjU5OSwyOC40MjkwNTQxIDEzLjg2MDEzOTksMjcuODgxNzU2OCBDMTQuMzk0MDE5OCwyNy4zMzQ0NTk1IDE1LjEyNTYzMywyNyAxNS45MjY0NTI5LDI3IEw1MS4wNzM1NDcxLDI3IEM1Mi42ODUwNzM1LDI3IDU0LDI4LjM0Nzk3MyA1NCwzMCBDNTQsMzAuODIwOTQ1OSA1My42NjM4NTM0LDMxLjU3MDk0NTkgNTMuMTM5ODYwMSwzMi4xMTgyNDMyIEw1My4xMzk4NjAxLDMyLjExODI0MzIgWiBNNTMuMTM5ODYwMSwxNi4xMTgyNDMyIEM1Mi42MDU5ODAyLDE2LjY2NTU0MDUgNTEuODc0MzY3LDE3IDUxLjA3MzU0NzEsMTcgTDE1LjkyNjQ1MjksMTcgQzE0LjMxNDkyNjUsMTcgMTMsMTUuNjUyMDI3IDEzLDE0IEMxMywxMy4xNzkwNTQxIDEzLjMyNjI1OTksMTIuNDE4OTE4OSAxMy44NjAxMzk5LDExLjg4MTc1NjggQzE0LjM5NDAxOTgsMTEuMzM0NDU5NSAxNS4xMjU2MzMsMTEgMTUuOTI2NDUyOSwxMSBMNTEuMDczNTQ3MSwxMSBDNTIuNjg1MDczNSwxMSA1NCwxMi4zNDc5NzMgNTQsMTQgQzU0LDE0LjgyMDk0NTkgNTMuNjYzODUzNCwxNS41NzA5NDU5IDUzLjEzOTg2MDEsMTYuMTE4MjQzMiBMNTMuMTM5ODYwMSwxNi4xMTgyNDMyIFoiIGlkPSLlvaLnirYiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+';
75
75
 
76
+ var video_channel_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiMyQ0U4OTgiIHAtaWQ9IjE2OTYiPjwvcGF0aD48L3N2Zz4=';
77
+
78
+ var video_channel_offLine_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiM5MDkzOTkiIHAtaWQ9IjE2OTYiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3gubWFuYWdlX3R5cGVfbXlwcm9qZWN0cy4wLmk0LjE4OTEzYTgxZlVzY2xCIiBjbGFzcz0ic2VsZWN0ZWQiPjwvcGF0aD48L3N2Zz4=';
79
+
80
+ var video_channel_monitor_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzY0MDQyMzI0MzIxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2OTUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMS40MTA4NiAwLjAwMDI2QTUxMS4wNDk4NyA1MTEuMDQ5ODcgMCAwIDEgNjczLjA5NTgxOSAyNi4wODAyNTNsNS4xOTk5OTkgMS43OWEzNjkuMjk5OTA2IDM2OS4yOTk5MDYgMCAwIDEgMTMuNjM1OTk2IDQuODU4OTk5bDIuNTU3IDEuMDIyOTk5YTM5MS4yOTk5MDEgMzkxLjI5OTkwMSAwIDAgMSAyOC4wNDE5OTMgMTEuNjc2OTk3IDY5My43ODY4MjQgNjkzLjc4NjgyNCAwIDAgMSAzNC4wOTE5OTEgMTcuMDQ1OTk2IDU4OC42OTU4NTEgNTg4LjY5NTg1MSAwIDAgMSAzNy41ODc5OSAyMi43NTY5OTRsMTIuMTAxOTk3IDguMzUyOTk4IDQuNzcyOTk5IDMuNDA4OTk5IDkuNjMxOTk4IDcuMTU5OTk5IDYuMzA2OTk4IDQuODU3OTk4YTYwMS45MDY4NDcgNjAxLjkwNjg0NyAwIDAgMSAyOC42Mzc5OTMgMjQuMjA0OTk0IDU4NC4zNDk4NTIgNTg0LjM0OTg1MiAwIDAgMSAzNi40Nzg5OSAzNi44MTk5OTFsNC42MDE5OTkgNS4xMTM5OTlhNTIzLjA2Nzg2NyA1MjMuMDY3ODY3IDAgMCAxIDQxLjMzNzk5IDU0LjIwNzk4NmwzLjY2NDk5OSA1LjYyNDk5OGEzNjguNTQxOTA2IDM2OC41NDE5MDYgMCAwIDEgMTAuMjI3OTk3IDE2LjcwNTk5Nmw0LjI2MDk5OSA3LjI0Mzk5OCA0Ljc3Mjk5OSA4LjYwODk5OCA1LjExMzk5OSA5LjcxNTk5OCAxLjcwNDk5OSAzLjQwOTk5OSAxLjcwNCAzLjQwODk5OWEyMTIuMjg3OTQ2IDIxMi4yODc5NDYgMCAwIDEgNC44NTg5OTkgOS44ODY5OTdsMi43MjY5OTkgNS44Nzk5OTlhNDE3LjEyNDg5NCA0MTcuMTI0ODk0IDAgMCAxIDExLjg0Njk5NyAyOC4xMjY5OTNsMC40MjYgMS4yNzg5OTljMi4xMzA5OTkgNS42MjQ5OTkgNC4yNjE5OTkgMTEuMzM0OTk3IDYuMTM2OTk4IDE3LjA0NTk5NmwwLjM0MSAwLjg1MmE1MDcuMTI5ODcxIDUwNy4xMjk4NzEgMCAwIDEgMTUuNTk2OTk2IDU2Ljc2NDk4NWwxLjYyIDcuNjY5OTk4YTU3OC40Njc4NTMgNTc4LjQ2Nzg1MyAwIDAgMSA2LjIyMTk5OCAzOS44ODg5OWwxLjE5MyAxMS4wNzk5OTggMC43NjcgOC4zNTI5OTdjMC41MTIgNy4wNzM5OTggMC44NTIgMTQuMTQ3OTk2IDEuMTkyOTk5IDIxLjMwNzk5NWwwLjM0MSAxOS4xNzY5OTVBNTExLjM5MDg3IDUxMS4zOTA4NyAwIDEgMSAxLjYzOTk5IDQ3MC45MDYxNGwwLjY4MTk5OS04LjM1Mjk5NyAxLjE5My0xMS4wNzk5OThhNDk0LjU5OTg3NCA0OTQuNTk5ODc0IDAgMCAxIDIuNTU2OTk5LTE5LjE3Njk5NWwxLjcwNC0xMC41Njg5OTdMOS44MjE5ODggNDExLjUwMDE1NmwxLjUzMzk5OS03LjQ5OTk5OWE1MzYuNzA0ODY0IDUzNi43MDQ4NjQgMCAwIDEgMTUuNTk3OTk2LTU2Ljg0OTk4NWwwLjM0LTAuODUyYTU3OC4xNDc4NTMgNTc4LjE0Nzg1MyAwIDAgMSA2LjEzNjk5OS0xNy4wNDU5OTZsMC40MjU5OTktMS4yNzg5OTlhNTA3LjYzOTg3MSA1MDcuNjM5ODcxIDAgMCAxIDYuODE4OTk5LTE2Ljg3NTk5Nmw1LjAyODk5OC0xMS4yNDk5OTcgMi43MjctNS45NjY5OTkgMi4zODU5OTktNC45NDI5OTggMi4zODY5OTktNC45NDM5OTkgMy40MS02LjY0Nzk5OGEzOTMuMzQ0OSAzOTMuMzQ0OSAwIDAgMSAxNC4xNDc5OTYtMjUuNjUzOTk0IDgzMy4zMTE3ODggODMzLjMxMTc4OCAwIDAgMSAxMC4yMjc5OTctMTYuNzA1OTk2bDMuNzQ5OTk5LTUuNjI0OTk4YTQ4NS41NjU4NzcgNDg1LjU2NTg3NyAwIDAgMSA0MS4zMzY5OS01NC4xMjE5ODZsNC42MDI5OTktNS4xOTk5OTkgOC44NjM5OTgtOS42Mjk5OThhMzU4LjgyNTkwOSAzNTguODI1OTA5IDAgMCAxIDEzLjM4MDk5Ni0xMy42Mzc5OTZsNC4wMDU5OTktMy45MTk5OTlhNTkwLjY1Njg1IDU5MC42NTY4NSAwIDAgMSAyMy4wMTI5OTQtMjAuODgxOTk1bDYuNzMyOTk5LTUuNjI1OTk5YTYwNi45MzU4NDYgNjA2LjkzNTg0NiAwIDAgMSAyNS4wNTc5OTMtMTkuMzQ2OTk1bDQuNjg3OTk5LTMuNDA5OTk5YTU2MS40MjE4NTcgNTYxLjQyMTg1NyAwIDAgMSA0OS43NzQ5ODctMzEuMDIzOTkybDQuODU4OTk5LTIuNjQxOTk5IDEwLjY1Mjk5Ny01LjUzOTk5OWEzNzUuNzg2OTA1IDM3NS43ODY5MDUgMCAwIDEgMjUuMzk5OTk0LTExLjkzMjk5N2w4Ljk0ODk5OC0zLjgzNDk5OSAxMi4yNzI5OTctNC44NTc5OTkgMi41NTY5OTktMC45Mzc5OTkgMTQuNTc0OTk2LTUuMjgzOTk5IDkuNTQ1OTk4LTMuMjM4OTk5LTkuNTQ1OTk4IDMuMTUzOTk5IDQuMjYwOTk5LTEuMzY0IDEwLjQ4Mzk5OC0zLjQwOTk5OUE1MTIuNzU0ODcgNTEyLjc1NDg3IDAgMCAxIDUxMS40MTA4NiAwLjAwMDI2eiBtMCAyMDQuNTU1OTQ4YTMwNi44MzQ5MjIgMzA2LjgzNDkyMiAwIDEgMCAwIDYxMy42Njk4NDQgMzA2LjgzNDkyMiAzMDYuODM0OTIyIDAgMCAwIDAtNjEzLjY2OTg0NHogbTAgMTAyLjI3ODk3NGEyMDQuNjQxOTQ4IDIwNC42NDE5NDggMCAwIDEgMC4wODYgNDA5LjE5Nzg5NiAyMDQuNTU1OTQ4IDIwNC41NTU5NDggMCAwIDEtMjA0LjU1Njk0OC0yMDQuNTU2OTQ4YzAtMjQuMDM0OTk0IDQuODU3OTk5LTQ2Ljg3Njk4OCAxMi40NDM5OTctNjguMzU1OTgzYTc2LjcwODk4MSA3Ni43MDg5ODEgMCAwIDAgMTMyLjYxOTk2Ni01Mi4yNDY5ODYgNzYuNzA4OTgxIDc2LjcwODk4MSAwIDAgMC0zMS42MTk5OTItNjEuNzA3OTg1IDIwMS4yMzE5NDkgMjAxLjIzMTk0OSAwIDAgMSA5MS4wMjY5NzctMjIuMzI5OTk0eiBtMC0yMzAuMTI1OTQxYy00MS45MzM5ODkgMC04Mi41MDM5NzkgNS45NjU5OTgtMTIwLjk0Mzk2OSAxNy4wNDU5OTUgMjcuODcwOTkzIDM2LjMwODk5MSA3MS41OTQ5ODIgNTkuNjYxOTg1IDEyMC45NDM5NjkgNTkuNjYxOTg1IDQ5LjQzNDk4NyAwIDkyLjk4Nzk3Ni0yMy4zNTI5OTQgMTIwLjk0Mzk2OS01OS42NjE5ODVhNDMxLjg2OTg5IDQzMS44Njk4OSAwIDAgMC0xMjAuOTQzOTY5LTE3LjA0NTk5NXoiIGZpbGw9IiMyREYyRkYiIHAtaWQ9IjE2OTYiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3gubWFuYWdlX3R5cGVfbXlwcm9qZWN0cy4wLmk0LjE4OTEzYTgxZlVzY2xCIiBjbGFzcz0ic2VsZWN0ZWQiPjwvcGF0aD48L3N2Zz4=';
81
+
76
82
  const svgMap = {
77
83
  workCard_svg,
78
84
  workCard_offLine_svg,
@@ -105,17 +111,157 @@ const svgMap = {
105
111
  walkieTalkie_svg,
106
112
  walkieTalkie_offLine_svg,
107
113
  menu_acquisitionStation_svg,
108
- noData
114
+ noData,
115
+ video_channel_svg,
116
+ video_channel_offLine_svg,
117
+ video_channel_monitor_svg
109
118
  };
110
119
 
120
+ const setElementFocus = (config) => {
121
+ const { container, trigger, onFocus, onBlur } = config;
122
+ let btn = document.createElement('button');
123
+ const btnFocus = () => {
124
+ btn.focus();
125
+ onFocus && onFocus();
126
+ };
127
+ const btnBlur = () => {
128
+ btn.blur();
129
+ onBlur && onBlur();
130
+ };
131
+ if (trigger === 'click') {
132
+ container.addEventListener('click', btnFocus);
133
+ btn.addEventListener('blur', btnBlur);
134
+ }
135
+ else {
136
+ container.addEventListener('mouseenter', btnFocus);
137
+ container.addEventListener('mouseleave', btnBlur);
138
+ }
139
+ return {
140
+ focus: btnFocus,
141
+ blur: btnBlur,
142
+ destroy() {
143
+ // @ts-ignore
144
+ btn = null;
145
+ if (!container)
146
+ return;
147
+ if (trigger === 'click') {
148
+ container.removeEventListener('click', btnFocus);
149
+ }
150
+ else {
151
+ container.removeEventListener('mouseenter', btnFocus);
152
+ container.removeEventListener('mouseleave', btnBlur);
153
+ }
154
+ }
155
+ };
156
+ };
157
+
158
+ let container;
159
+ const getContainer$1 = () => {
160
+ if (container)
161
+ return container;
162
+ container = document.createElement('div');
163
+ document.body.appendChild(container);
164
+ return container;
165
+ };
166
+ class Tooltip {
167
+ _el;
168
+ _config;
169
+ _focus;
170
+ _timer;
171
+ constructor(props) {
172
+ if (!props.bind || !isElement(props.bind))
173
+ throw Error('【bind参数错误】:请传入元素节点');
174
+ this._config = this._generateConfig(props);
175
+ this._render();
176
+ }
177
+ _generateConfig(config) {
178
+ return {
179
+ placement: "top",
180
+ offset: 0,
181
+ trigger: "hover",
182
+ autoClose: 0,
183
+ ...config
184
+ };
185
+ }
186
+ _render() {
187
+ const { bind, content } = this._config;
188
+ const el = document.createElement('div');
189
+ el.classList.add('hy-tooltip');
190
+ if (isElement(content)) {
191
+ el.appendChild(content);
192
+ }
193
+ else {
194
+ el.innerHTML = `${content}`;
195
+ }
196
+ const arrow = document.createElement('span');
197
+ arrow.classList.add('hy-popper__arrow');
198
+ el.appendChild(arrow);
199
+ this._el = el;
200
+ this._focus = setElementFocus({
201
+ container: bind,
202
+ trigger: this._config.trigger,
203
+ onFocus: () => {
204
+ if (!this._el)
205
+ return;
206
+ const container = getContainer$1();
207
+ container.appendChild(this._el);
208
+ this.setPopper();
209
+ if (this._config?.autoClose && isNumber(this._config?.autoClose)) {
210
+ this._timer && clearTimeout(this._timer);
211
+ this._timer = setTimeout(() => {
212
+ this._focus && this._focus.blur();
213
+ }, this._config?.autoClose);
214
+ }
215
+ },
216
+ onBlur: () => {
217
+ this._timer && clearTimeout(this._timer);
218
+ if (!this._el || !this._el.parentElement)
219
+ return;
220
+ this._el.parentElement.removeChild(this._el);
221
+ }
222
+ });
223
+ }
224
+ setPopper() {
225
+ if (!this._config || !this._el)
226
+ return;
227
+ const { offset, placement } = this._config;
228
+ const { top, left, width, height } = this._config.bind.getBoundingClientRect();
229
+ this._el.classList.add(placement);
230
+ switch (placement) {
231
+ case 'top':
232
+ this._el.style.setProperty('top', `${top - offset}px`);
233
+ this._el.style.setProperty('left', `${left + width / 2}px`);
234
+ break;
235
+ case 'bottom':
236
+ this._el.style.setProperty('top', `${top + height + offset}px`);
237
+ this._el.style.setProperty('left', `${left + width / 2}px`);
238
+ break;
239
+ case 'left':
240
+ this._el.style.setProperty('top', `${top + height / 2}px`);
241
+ this._el.style.setProperty('left', `${left - offset}px`);
242
+ break;
243
+ case 'right':
244
+ this._el.style.setProperty('top', `${top + height / 2}px`);
245
+ this._el.style.setProperty('left', `${left + width + offset}px`);
246
+ break;
247
+ }
248
+ }
249
+ destroy() {
250
+ this._timer && clearTimeout(this._timer);
251
+ this._focus && this._focus.destroy();
252
+ this._config = undefined;
253
+ }
254
+ }
255
+
111
256
  class Icon {
112
257
  _el;
113
258
  _disabled;
114
- constructor(config) {
115
- config = this._generateConfig(config);
259
+ _tooltip;
260
+ constructor(props) {
261
+ const config = this._generateConfig(props);
116
262
  this._disabled = config.disabled;
117
263
  if (!config.svgName)
118
- return;
264
+ throw Error('【svgName参数错误】:请传入图标名称');
119
265
  this._render(config);
120
266
  }
121
267
  _generateConfig(config) {
@@ -127,9 +273,17 @@ class Icon {
127
273
  };
128
274
  }
129
275
  _render(config) {
130
- const { svgName = '' } = config;
276
+ const { svgName = '', className } = config;
131
277
  const el = document.createElement('div');
132
278
  el.classList.add('hy-icon');
279
+ if (className) {
280
+ const classList = className.split(' ');
281
+ for (const name of classList) {
282
+ if (!name)
283
+ continue;
284
+ el.classList.add(name);
285
+ }
286
+ }
133
287
  const image = document.createElement('img');
134
288
  image.src = svgMap ? svgMap[svgName] : '';
135
289
  image.style.maxWidth = '100%';
@@ -154,12 +308,22 @@ class Icon {
154
308
  }
155
309
  });
156
310
  this._el = el;
311
+ if (config.tip) {
312
+ this._tooltip = new Tooltip({
313
+ bind: el,
314
+ content: config.tip
315
+ });
316
+ }
157
317
  }
158
318
  mount(container) {
159
319
  if (!this._el)
160
320
  return;
161
321
  container.appendChild(this._el);
162
322
  }
323
+ destroy() {
324
+ this._el = undefined;
325
+ this._tooltip && this._tooltip.destroy();
326
+ }
163
327
  }
164
328
 
165
329
  // @ts-nocheck
@@ -600,6 +764,64 @@ class Radio {
600
764
  }
601
765
  }
602
766
 
767
+ // 设备状态列表
768
+ let globalDeviceStatus = {
769
+ 0: '离线',
770
+ 1: '在线',
771
+ 2: '监控中',
772
+ 3: '通话中',
773
+ 4: '录像中',
774
+ 5: '录音中',
775
+ 6: '广播中',
776
+ 7: 'SOS'
777
+ };
778
+ const setGlobalDeviceStatus = (status = {}) => {
779
+ globalDeviceStatus = {
780
+ ...globalDeviceStatus,
781
+ ...status,
782
+ };
783
+ };
784
+ const getGlobalDeviceStatus = () => {
785
+ return globalDeviceStatus;
786
+ };
787
+
788
+ // 业务类型(config.business) device-设备 channel-通道设备 groupDevice-群组设备 group-群组 user-用户 cs-采集站
789
+ var Business;
790
+ (function (Business) {
791
+ Business["DEVICE"] = "device";
792
+ Business["CHANNEL"] = "channel";
793
+ Business["GROUP_DEVICE"] = "groupDevice";
794
+ Business["GROUP"] = "group";
795
+ Business["USER"] = "user";
796
+ Business["CS"] = "cs";
797
+ })(Business || (Business = {}));
798
+ // 设备状态(data.deviceStatus) 0-离线 1-在线 2-监控中 3-通话中 4-录像中 5-录音中 6-广播中 7-SOS
799
+ var DeviceStatus;
800
+ (function (DeviceStatus) {
801
+ DeviceStatus[DeviceStatus["OFF_LINE"] = 0] = "OFF_LINE";
802
+ DeviceStatus[DeviceStatus["ON_LINE"] = 1] = "ON_LINE";
803
+ DeviceStatus[DeviceStatus["BE_MONITOR"] = 2] = "BE_MONITOR";
804
+ DeviceStatus[DeviceStatus["IN_CALL"] = 3] = "IN_CALL";
805
+ DeviceStatus[DeviceStatus["IN_VIDEO_RECORD"] = 4] = "IN_VIDEO_RECORD";
806
+ DeviceStatus[DeviceStatus["IN_AUDIO_RECORD"] = 5] = "IN_AUDIO_RECORD";
807
+ DeviceStatus[DeviceStatus["IN_BROADCASE"] = 6] = "IN_BROADCASE";
808
+ DeviceStatus[DeviceStatus["SOS"] = 7] = "SOS"; // SOS
809
+ })(DeviceStatus || (DeviceStatus = {}));
810
+ // 业务数据类型(data.dataType) 1-部门 3-设备 4-群组 5-用户 6-考勤 7-水源点 8-采集站 9-设备通道
811
+ var DataType;
812
+ (function (DataType) {
813
+ DataType[DataType["UNKNOW_1"] = 0] = "UNKNOW_1";
814
+ DataType[DataType["DEPT"] = 1] = "DEPT";
815
+ DataType[DataType["UNKNOW_2"] = 2] = "UNKNOW_2";
816
+ DataType[DataType["DEVICE"] = 3] = "DEVICE";
817
+ DataType[DataType["GROUP"] = 4] = "GROUP";
818
+ DataType[DataType["USER"] = 5] = "USER";
819
+ DataType[DataType["ATTENDANCE"] = 6] = "ATTENDANCE";
820
+ DataType[DataType["WATER_SOURCE"] = 7] = "WATER_SOURCE";
821
+ DataType[DataType["CS"] = 8] = "CS";
822
+ DataType[DataType["CHANNEL"] = 9] = "CHANNEL"; // 设备通道
823
+ })(DataType || (DataType = {}));
824
+
603
825
  /** 生成配置项 */
604
826
  const useConfig = (config) => {
605
827
  let props = Object.assign({
@@ -622,37 +844,28 @@ const useConfig = (config) => {
622
844
  }, config.rowSelection);
623
845
  // 业务配置
624
846
  let businessConfig = {
625
- statusTextList: [],
847
+ deviceStatusMap: {},
626
848
  filterConfig: [],
627
849
  sortByStatus: true,
628
850
  clearEmptyBusiness: false,
629
- integratedBusiness: false,
851
+ isShowChannelSelect: true,
630
852
  ...(config.businessConfig || {})
631
853
  };
632
854
  // 设备树
633
- if (['device', 'groupDevice'].includes(`${config.business}`)) {
855
+ if (config.business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(config.business)) {
634
856
  businessConfig = {
635
- statusTextList: [
636
- '离线',
637
- '在线',
638
- '监控中',
639
- '通话中',
640
- '录像中',
641
- '录音中',
642
- '广播中',
643
- 'SOS'
644
- ],
857
+ deviceStatusMap: getGlobalDeviceStatus(),
645
858
  filterConfig: [],
646
859
  sortByStatus: true,
647
860
  clearEmptyBusiness: false,
648
- integratedBusiness: false,
861
+ isShowChannelSelect: true,
649
862
  ...(config.businessConfig || {})
650
863
  };
651
864
  props = {
652
865
  class: '',
653
866
  disabled: 'disabled',
654
867
  showStatus: false,
655
- showCount: (data) => data.dataType !== 3,
868
+ showCount: (data) => !/^(3|9)$/.test(data.dataType),
656
869
  ...(config.props || {}),
657
870
  value: 'onlyId',
658
871
  label: 'label',
@@ -664,7 +877,7 @@ const useConfig = (config) => {
664
877
  showSelect: (data) => {
665
878
  if (rowSelection.type === 'checkbox')
666
879
  return true;
667
- return data.dataType === 3;
880
+ return /^(3|9)$/.test(data.dataType);
668
881
  },
669
882
  ...rowSelection
670
883
  };
@@ -722,6 +935,7 @@ const useConfig = (config) => {
722
935
  fontSize: 14,
723
936
  bgColor: '',
724
937
  nodeBgColor: '#1c334a',
938
+ channelBgColor: '#10263B',
725
939
  emptyText: '暂无数据',
726
940
  bufferSize: 50,
727
941
  expandOnClickNode: true,
@@ -746,13 +960,16 @@ const useHandleFun = (config) => {
746
960
  if (!node)
747
961
  return '';
748
962
  if (business && isBusiness) {
749
- switch (business) {
750
- case 'device':
751
- case 'groupDevice':
752
- return node.deviceId;
753
- case 'user':
754
- case 'cs':
963
+ switch (node.deviceType) {
964
+ case DataType.DEPT: // 部门
965
+ case DataType.GROUP: // 群组
966
+ case DataType.USER: // 用户
967
+ case DataType.CS: // 采集站
755
968
  return node.id;
969
+ case DataType.DEVICE: // 设备
970
+ return node.deviceId;
971
+ case DataType.CHANNEL: // 设备通道
972
+ return node.channelId;
756
973
  }
757
974
  }
758
975
  return node[props.value];
@@ -782,7 +999,7 @@ const useHandleFun = (config) => {
782
999
  return;
783
1000
  return node[props.total];
784
1001
  }
785
- if (['device', 'groupDevice'].includes(`${business}`)) {
1002
+ if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
786
1003
  countFilter = (data) => {
787
1004
  return data.dataType === 3 && data.onlineState === 1;
788
1005
  };
@@ -810,6 +1027,20 @@ const useHandleFun = (config) => {
810
1027
  totalFilter,
811
1028
  // 设置设备状态
812
1029
  setDeviceStatus: (data) => {
1030
+ // 通道状态
1031
+ if (data.deviceType === 9) {
1032
+ if (data.onlineState === 1) {
1033
+ // 监控中
1034
+ if (data.beMonitor === 1) {
1035
+ return 2;
1036
+ }
1037
+ // 在线
1038
+ return 1;
1039
+ }
1040
+ // 离线
1041
+ return 0;
1042
+ }
1043
+ // 设备状态
813
1044
  if (data.onlineState === 1) {
814
1045
  // 监控中
815
1046
  if (data.monitor === 1 || data.beMonitor === 1) {
@@ -851,12 +1082,26 @@ const getDisabled = (config, node) => {
851
1082
  if (isFunction(disabled))
852
1083
  return disabled(node.data, node);
853
1084
  };
1085
+ const isShowSelect = (config, node = null) => {
1086
+ const { showSelect } = config.rowSelection;
1087
+ if (isBoolean(showSelect) || node === null)
1088
+ return !!showSelect;
1089
+ const { isShowChannelSelect } = config.businessConfig;
1090
+ if (config.business === Business.CHANNEL && !isShowChannelSelect && node.data.dataType === DataType.CHANNEL)
1091
+ return false;
1092
+ return !!(isFunction(showSelect) && showSelect(node.data, node));
1093
+ };
1094
+ const isCheckLeaf = (config, node) => {
1095
+ if (config.business !== Business.CHANNEL || config.businessConfig.isShowChannelSelect)
1096
+ return node.isLeaf;
1097
+ return node.data.dataType === 3 ? true : node.isLeaf;
1098
+ };
854
1099
  function useCheck(props, tree) {
855
1100
  const checkedKeys = new Set();
856
1101
  let indeterminateKeys = new Set();
857
1102
  const updateCheckedKeys = () => {
858
- const { showSelect, checkStrictly } = props.rowSelection;
859
- if (!tree || !showSelect || checkStrictly) {
1103
+ const { checkStrictly } = props.rowSelection;
1104
+ if (!tree || checkStrictly) {
860
1105
  return;
861
1106
  }
862
1107
  const { levelTreeNodeMap, maxLevel } = tree;
@@ -867,28 +1112,39 @@ function useCheck(props, tree) {
867
1112
  if (!nodes)
868
1113
  continue;
869
1114
  nodes.forEach((node) => {
870
- const children = node.children;
871
- if (tree.hiddenNodeKeySet.has(node.key))
1115
+ if (tree.hiddenNodeKeySet.has(node.key) || !isShowSelect(props, node))
872
1116
  return;
873
- if (children) {
1117
+ if (node.children && !isCheckLeaf(props, node)) {
874
1118
  let allChecked = true;
875
1119
  let hasChecked = false;
876
- for (const childNode of children) {
1120
+ let allHide = true;
1121
+ for (const childNode of node.children) {
877
1122
  const key = childNode.key;
878
- if (tree.hiddenNodeKeySet.has(key))
1123
+ // 通道需要循环处理
1124
+ if (childNode.data.dataType !== DataType.CHANNEL &&
1125
+ (tree.hiddenNodeKeySet.has(key) || !isShowSelect(props, node))) {
879
1126
  continue;
880
- if (checkedKeySet.has(key)) {
881
- hasChecked = true;
882
1127
  }
883
- else if (indeterminateKeySet.has(key)) {
884
- allChecked = false;
885
- hasChecked = true;
886
- break;
887
- }
888
- else {
889
- allChecked = false;
1128
+ if ((props.businessConfig?.showOnlineState && childNode.data.deviceStatus !== DeviceStatus.OFF_LINE) ||
1129
+ !props.businessConfig?.showOnlineState) {
1130
+ allHide = false;
1131
+ if (checkedKeySet.has(key)) {
1132
+ hasChecked = true;
1133
+ }
1134
+ else if (indeterminateKeySet.has(key)) {
1135
+ allChecked = false;
1136
+ hasChecked = true;
1137
+ break;
1138
+ }
1139
+ else {
1140
+ allChecked = false;
1141
+ }
890
1142
  }
891
1143
  }
1144
+ // 所有子元素都隐藏,则判断自身的选中状态
1145
+ if (allHide) {
1146
+ allChecked = checkedKeySet.has(node.key);
1147
+ }
892
1148
  if (allChecked) {
893
1149
  checkedKeySet.add(node.key);
894
1150
  }
@@ -930,7 +1186,7 @@ function useCheck(props, tree) {
930
1186
  const children = node.children;
931
1187
  if ((!checkStrictly || checkOnDbclick) && children) {
932
1188
  children.forEach((childNode) => {
933
- if (!getDisabled(props, childNode)) {
1189
+ if (!getDisabled(props, childNode) && isShowSelect(props, childNode)) {
934
1190
  toggle(childNode, checked);
935
1191
  }
936
1192
  });
@@ -987,21 +1243,39 @@ function useCheck(props, tree) {
987
1243
  const checkedBusinessKeys = [];
988
1244
  const checkedBusinessNodes = [];
989
1245
  const { business } = props;
990
- if (tree && props.rowSelection.showSelect) {
1246
+ if (tree && isShowSelect(props)) {
991
1247
  const { treeNodeMap } = tree;
992
1248
  checkedKeys.forEach((key) => {
993
1249
  const node = treeNodeMap.get(key);
994
- if (node && (!leafOnly || (leafOnly && node.isLeaf))) {
1250
+ if (!node || !isShowSelect(props, node))
1251
+ return;
1252
+ if (!leafOnly || (leafOnly && isCheckLeaf(props, node))) {
995
1253
  const data = node.data;
996
1254
  keys.push(key);
997
1255
  checkedNodes.push(data);
998
1256
  // 业务选中
999
- if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3)
1000
- || (business === 'user' && data.dataType === 5)
1001
- || (business === 'cs' && data.dataType === 8)) {
1257
+ if ((['device', 'groupDevice'].includes(`${business}`) && data.dataType === 3) ||
1258
+ (business === 'user' && data.dataType === 5) ||
1259
+ (business === 'cs' && data.dataType === 8)) {
1002
1260
  checkedBusinessKeys.push(key);
1003
1261
  checkedBusinessNodes.push(node.data);
1004
1262
  }
1263
+ // 通道类型业务选中
1264
+ else if (business === Business.CHANNEL && /^(3|9)$/.test(`${data.dataType}`)) {
1265
+ // 开启通道可选中
1266
+ if (props.businessConfig?.isShowChannelSelect) {
1267
+ // 通道类型 或 没有通道的设备
1268
+ if (data.dataType === 9 || isCheckLeaf(props, node)) {
1269
+ checkedBusinessKeys.push(key);
1270
+ checkedBusinessNodes.push(node.data);
1271
+ }
1272
+ }
1273
+ // 关闭通道可选中
1274
+ else if (data.dataType === 3) {
1275
+ checkedBusinessKeys.push(key);
1276
+ checkedBusinessNodes.push(node.data);
1277
+ }
1278
+ }
1005
1279
  }
1006
1280
  });
1007
1281
  }
@@ -1023,14 +1297,14 @@ function useCheck(props, tree) {
1023
1297
  function getHalfChecked() {
1024
1298
  const halfCheckedNodes = [];
1025
1299
  const halfCheckedKeys = [];
1026
- if (tree && props.rowSelection.showSelect) {
1300
+ if (tree && isShowSelect(props)) {
1027
1301
  const { treeNodeMap } = tree;
1028
1302
  indeterminateKeys.forEach((key) => {
1029
1303
  const node = treeNodeMap.get(key);
1030
- if (node) {
1031
- halfCheckedKeys.push(key);
1032
- halfCheckedNodes.push(node.data);
1033
- }
1304
+ if (!node || !isShowSelect(props, node))
1305
+ return;
1306
+ halfCheckedKeys.push(key);
1307
+ halfCheckedNodes.push(node.data);
1034
1308
  });
1035
1309
  }
1036
1310
  return {
@@ -1052,45 +1326,118 @@ function useCheck(props, tree) {
1052
1326
  _setCheckedKeys(keys, isBusiness);
1053
1327
  }
1054
1328
  function setChecked(key, isChecked, isBusiness = false) {
1329
+ if (!tree || !isShowSelect(props))
1330
+ return;
1331
+ const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
1332
+ if (!isBusiness || !props.business) {
1333
+ const node = treeNodeMap.get(key);
1334
+ if (node) {
1335
+ toggleCheckbox(node, isChecked, false);
1336
+ }
1337
+ return;
1338
+ }
1339
+ let nodeList = [];
1340
+ switch (props.business) {
1341
+ case Business.DEVICE:
1342
+ case Business.GROUP_DEVICE:
1343
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1344
+ break;
1345
+ case Business.CHANNEL:
1346
+ const channel = channelMap && channelMap.get(key);
1347
+ if (channel) {
1348
+ nodeList = [channel];
1349
+ }
1350
+ else {
1351
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1352
+ }
1353
+ break;
1354
+ case Business.USER:
1355
+ nodeList = (userMap && userMap.get(key)) || [];
1356
+ break;
1357
+ case Business.CS:
1358
+ nodeList = (csMap && csMap.get(key)) || [];
1359
+ break;
1360
+ }
1361
+ for (const node of nodeList) {
1362
+ if (!isShowSelect(props, node))
1363
+ continue;
1364
+ toggleCheckbox(node, isChecked, false);
1365
+ }
1366
+ }
1367
+ function _setCheckedKeys(keys = [], isBusiness = false) {
1055
1368
  if (!tree)
1056
1369
  return;
1057
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1058
- if (props.rowSelection.showSelect) {
1370
+ const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
1371
+ if (!isShowSelect(props) || !treeNodeMap || !keys.length)
1372
+ return;
1373
+ for (const key of keys) {
1374
+ // 通用逻辑
1059
1375
  if (!isBusiness || !props.business) {
1060
1376
  const node = treeNodeMap.get(key);
1061
- if (node) {
1062
- toggleCheckbox(node, isChecked, false);
1377
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1378
+ toggleCheckbox(node, true, false, false);
1063
1379
  }
1064
- return;
1380
+ continue;
1065
1381
  }
1382
+ // 业务逻辑
1066
1383
  let nodeList = [];
1067
1384
  switch (props.business) {
1068
- case 'device':
1069
- case 'groupDevice':
1385
+ case Business.DEVICE:
1386
+ case Business.GROUP_DEVICE:
1070
1387
  nodeList = (deviceMap && deviceMap.get(key)) || [];
1071
1388
  break;
1072
- case 'user':
1389
+ case Business.CHANNEL:
1390
+ const channel = channelMap && channelMap.get(key);
1391
+ if (channel) {
1392
+ nodeList = [channel];
1393
+ }
1394
+ else {
1395
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1396
+ }
1397
+ break;
1398
+ case Business.USER:
1073
1399
  nodeList = (userMap && userMap.get(key)) || [];
1074
1400
  break;
1075
- case 'cs':
1401
+ case Business.CS:
1076
1402
  nodeList = (csMap && csMap.get(key)) || [];
1077
1403
  break;
1078
1404
  }
1079
1405
  for (const node of nodeList) {
1080
- toggleCheckbox(node, isChecked, false);
1406
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1407
+ toggleCheckbox(node, true, false, false);
1408
+ }
1081
1409
  }
1082
1410
  }
1411
+ updateCheckedKeys();
1083
1412
  }
1084
- function _setCheckedKeys(keys = [], isBusiness = false) {
1085
- if (!tree)
1413
+ function setCheckedNodes(data, isBusiness = false) {
1414
+ if (!Array.isArray(data)) {
1415
+ console.warn('setCheckedNodes请传入数组');
1086
1416
  return;
1087
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1088
- if (props.rowSelection.showSelect && treeNodeMap && keys.length > 0) {
1089
- for (const key of keys) {
1417
+ }
1418
+ const { type } = props.rowSelection;
1419
+ checkedKeys.clear();
1420
+ indeterminateKeys.clear();
1421
+ if (type === 'radio' && data.length > 1) {
1422
+ data = [data[0]];
1423
+ }
1424
+ _setCheckedNodes(data, isBusiness);
1425
+ }
1426
+ function _setCheckedNodes(data = [], isBusiness = false) {
1427
+ if (tree) {
1428
+ const { treeNodeMap, deviceMap, channelMap, userMap, csMap } = tree;
1429
+ if (!isShowSelect(props) || !treeNodeMap || !data.length)
1430
+ return;
1431
+ const { getKey } = useHandleFun({
1432
+ business: props.business,
1433
+ props: props.props
1434
+ });
1435
+ for (const target of data) {
1090
1436
  // 通用逻辑
1437
+ let key = getKey(target);
1091
1438
  if (!isBusiness || !props.business) {
1092
1439
  const node = treeNodeMap.get(key);
1093
- if (node && !isChecked(node)) {
1440
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1094
1441
  toggleCheckbox(node, true, false, false);
1095
1442
  }
1096
1443
  continue;
@@ -1098,19 +1445,32 @@ function useCheck(props, tree) {
1098
1445
  // 业务逻辑
1099
1446
  let nodeList = [];
1100
1447
  switch (props.business) {
1101
- case 'device':
1102
- case 'groupDevice':
1448
+ case Business.DEVICE:
1449
+ case Business.GROUP_DEVICE:
1450
+ key = target.deviceId;
1103
1451
  nodeList = (deviceMap && deviceMap.get(key)) || [];
1104
1452
  break;
1105
- case 'user':
1453
+ case Business.CHANNEL:
1454
+ key = target.channelId;
1455
+ const channel = channelMap && channelMap.get(key);
1456
+ if (channel) {
1457
+ nodeList = [channel];
1458
+ }
1459
+ else {
1460
+ nodeList = (deviceMap && deviceMap.get(key)) || [];
1461
+ }
1462
+ break;
1463
+ case Business.USER:
1464
+ key = target.id;
1106
1465
  nodeList = (userMap && userMap.get(key)) || [];
1107
1466
  break;
1108
- case 'cs':
1467
+ case Business.CS:
1468
+ key = target.id;
1109
1469
  nodeList = (csMap && csMap.get(key)) || [];
1110
1470
  break;
1111
1471
  }
1112
1472
  for (const node of nodeList) {
1113
- if (node && !isChecked(node)) {
1473
+ if (node && !isChecked(node) && isShowSelect(props, node)) {
1114
1474
  toggleCheckbox(node, true, false, false);
1115
1475
  }
1116
1476
  }
@@ -1118,61 +1478,6 @@ function useCheck(props, tree) {
1118
1478
  updateCheckedKeys();
1119
1479
  }
1120
1480
  }
1121
- function setCheckedNodes(data, isBusiness = false) {
1122
- if (!Array.isArray(data)) {
1123
- console.warn('setCheckedNodes请传入数组');
1124
- return;
1125
- }
1126
- const { type } = props.rowSelection;
1127
- checkedKeys.clear();
1128
- indeterminateKeys.clear();
1129
- if (type === 'radio' && data.length > 1) {
1130
- data = [data[0]];
1131
- }
1132
- _setCheckedNodes(data, isBusiness);
1133
- }
1134
- function _setCheckedNodes(data = [], isBusiness = false) {
1135
- if (tree) {
1136
- const { treeNodeMap, deviceMap, userMap, csMap } = tree;
1137
- if (props.rowSelection.showSelect && treeNodeMap && data.length > 0) {
1138
- const { getKey } = useHandleFun(props);
1139
- for (const target of data) {
1140
- // 通用逻辑
1141
- let key = getKey(target);
1142
- if (!isBusiness || !props.business) {
1143
- const node = treeNodeMap.get(key);
1144
- if (node && !isChecked(node)) {
1145
- toggleCheckbox(node, true, false, false);
1146
- }
1147
- continue;
1148
- }
1149
- // 业务逻辑
1150
- let nodeList = [];
1151
- switch (props.business) {
1152
- case 'device':
1153
- case 'groupDevice':
1154
- key = target.deviceId;
1155
- nodeList = (deviceMap && deviceMap.get(key)) || [];
1156
- break;
1157
- case 'user':
1158
- key = target.id;
1159
- nodeList = (userMap && userMap.get(key)) || [];
1160
- break;
1161
- case 'cs':
1162
- key = target.id;
1163
- nodeList = (csMap && csMap.get(key)) || [];
1164
- break;
1165
- }
1166
- for (const node of nodeList) {
1167
- if (node && !isChecked(node)) {
1168
- toggleCheckbox(node, true, false, false);
1169
- }
1170
- }
1171
- }
1172
- updateCheckedKeys();
1173
- }
1174
- }
1175
- }
1176
1481
  return {
1177
1482
  checkedKeys,
1178
1483
  updateCheckedKeys,
@@ -1207,7 +1512,6 @@ function useFilter(config, filterMethod, tree = {
1207
1512
  if (!isFunction(filterMethod)) {
1208
1513
  return;
1209
1514
  }
1210
- const { integratedBusiness } = config.businessConfig;
1211
1515
  const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
1212
1516
  const isCountFiler = countFilter && isFunction(countFilter);
1213
1517
  const isTotalFiler = totalFilter && isFunction(totalFilter);
@@ -1218,37 +1522,21 @@ function useFilter(config, filterMethod, tree = {
1218
1522
  const nodes = tree.treeNodes || [];
1219
1523
  hiddenKeys.clear();
1220
1524
  function traverse(nodes, isShow = false) {
1221
- const deepBusinessList = [];
1222
1525
  let count = 0;
1223
1526
  let total = 0;
1224
1527
  nodes.forEach((node) => {
1225
- const businessList = [];
1226
1528
  family.push(node);
1227
1529
  if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
1228
1530
  family.forEach((member) => {
1229
1531
  expandKeySet.add(member.key);
1230
1532
  });
1231
- if (integratedBusiness && !/^1|4$/.test(node.data.dataType)) {
1232
- businessList.push(node.data);
1233
- deepBusinessList.push(node.data);
1234
- }
1235
1533
  }
1236
1534
  else if (node.isLeaf) {
1237
1535
  hiddenKeys.add(node.key);
1238
1536
  }
1239
1537
  const children = node.children;
1240
1538
  if (children) {
1241
- const { count: childCount, total: childTotal, businessList: list2 } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1242
- // 保存下层业务数据
1243
- if (integratedBusiness) {
1244
- for (const target of list2) {
1245
- if (!/^1|4$/.test(target.dataType)) {
1246
- businessList.push(target);
1247
- deepBusinessList.push(target);
1248
- }
1249
- }
1250
- node.data.childrenDeviceList = businessList;
1251
- }
1539
+ const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1252
1540
  node.count = isCountFiler ? childCount : getCount(node);
1253
1541
  node.total = isTotalFiler ? childTotal : getTotal(node);
1254
1542
  count += childCount;
@@ -1289,7 +1577,95 @@ function useFilter(config, filterMethod, tree = {
1289
1577
  }
1290
1578
  family.pop();
1291
1579
  });
1292
- return { count, total, businessList: deepBusinessList };
1580
+ return { count, total };
1581
+ }
1582
+ traverse(nodes);
1583
+ return expandKeySet;
1584
+ }
1585
+ // 通道过滤方法
1586
+ function channelFilter(params, filterAll = true) {
1587
+ if (!isFunction(filterMethod)) {
1588
+ return;
1589
+ }
1590
+ const { getCount, getTotal, countFilter, totalFilter } = useHandleFun(config);
1591
+ const isCountFiler = countFilter && isFunction(countFilter);
1592
+ const isTotalFiler = totalFilter && isFunction(totalFilter);
1593
+ const expandKeySet = new Set();
1594
+ const hiddenExpandIconKeys = hiddenExpandIconKeySet;
1595
+ const hiddenKeys = hiddenNodeKeySet;
1596
+ const family = [];
1597
+ const nodes = tree.treeNodes || [];
1598
+ hiddenKeys.clear();
1599
+ // 是否为过滤的根节点
1600
+ const isFilterLeaf = (node) => {
1601
+ if (config.business !== Business.CHANNEL)
1602
+ return node.isLeaf;
1603
+ return node.data.dataType === 3 || node.isLeaf;
1604
+ };
1605
+ function traverse(nodes, isShow = false) {
1606
+ let count = 0;
1607
+ let total = 0;
1608
+ nodes.forEach((node) => {
1609
+ const isLeaf = isFilterLeaf(node);
1610
+ family.push(node);
1611
+ if (isShow || (filterMethod && filterMethod(params, node.data, node))) {
1612
+ family.forEach((member) => {
1613
+ expandKeySet.add(member.key);
1614
+ });
1615
+ }
1616
+ else if (isLeaf) {
1617
+ hiddenKeys.add(node.key);
1618
+ }
1619
+ const children = node.children;
1620
+ if (children) {
1621
+ if (!isLeaf) {
1622
+ const { count: childCount, total: childTotal } = traverse(children, filterAll ? false : expandKeySet.has(node.key));
1623
+ node.count = isCountFiler ? childCount : getCount(node);
1624
+ node.total = isTotalFiler ? childTotal : getTotal(node);
1625
+ count += childCount;
1626
+ total += childTotal;
1627
+ }
1628
+ else if (!hiddenKeys.has(node.key)) {
1629
+ count++;
1630
+ total++;
1631
+ }
1632
+ }
1633
+ else if (!hiddenKeys.has(node.key)) {
1634
+ node.count = 0;
1635
+ node.total = 0;
1636
+ // 统计,当仅展示在线时,不统计离线的设备
1637
+ if (!tree.hiddenNodeKeySet.has(node.key)) {
1638
+ if (isCountFiler && countFilter) {
1639
+ count += countFilter(node.data) ? 1 : 0;
1640
+ }
1641
+ if (isTotalFiler && totalFilter) {
1642
+ total += totalFilter(node.data) ? 1 : 0;
1643
+ }
1644
+ }
1645
+ }
1646
+ if (!isLeaf) {
1647
+ if (!expandKeySet.has(node.key)) {
1648
+ hiddenKeys.add(node.key);
1649
+ }
1650
+ else if (children) {
1651
+ let allHidden = true;
1652
+ for (const childNode of children) {
1653
+ if (!hiddenKeys.has(childNode.key)) {
1654
+ allHidden = false;
1655
+ break;
1656
+ }
1657
+ }
1658
+ if (allHidden) {
1659
+ hiddenExpandIconKeys.add(node.key);
1660
+ }
1661
+ else {
1662
+ hiddenExpandIconKeys.delete(node.key);
1663
+ }
1664
+ }
1665
+ }
1666
+ family.pop();
1667
+ });
1668
+ return { count, total };
1293
1669
  }
1294
1670
  traverse(nodes);
1295
1671
  return expandKeySet;
@@ -1370,9 +1746,12 @@ function useFilter(config, filterMethod, tree = {
1370
1746
  return hiddenExpandIconKeySet.has(node.key);
1371
1747
  }
1372
1748
  switch (config.business) {
1373
- case 'group':
1749
+ case Business.GROUP:
1374
1750
  doFilter = doGroupFilter;
1375
1751
  break;
1752
+ case Business.CHANNEL:
1753
+ doFilter = channelFilter;
1754
+ break;
1376
1755
  default:
1377
1756
  doFilter = commitFilter;
1378
1757
  break;
@@ -1387,12 +1766,12 @@ function useFilter(config, filterMethod, tree = {
1387
1766
 
1388
1767
  const useStatus = (config, data, node) => {
1389
1768
  const { business, businessConfig } = config;
1390
- const { statusTextList } = businessConfig;
1391
- if (!business || !statusTextList || !statusTextList.length)
1769
+ const { deviceStatusMap } = businessConfig;
1770
+ if (!business || !deviceStatusMap || !Object.keys(deviceStatusMap).length)
1392
1771
  return;
1393
1772
  const el = document.createElement('div');
1394
1773
  // 设备树
1395
- if (['device', 'groupDevice'].includes(`${business}`)) {
1774
+ if (business && [Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(business)) {
1396
1775
  if (data.dataType !== 3)
1397
1776
  return;
1398
1777
  el.classList.add('hy-tree-node__status');
@@ -1405,7 +1784,7 @@ const useStatus = (config, data, node) => {
1405
1784
  else if (data.deviceStatus !== 0) {
1406
1785
  el.classList.add('hy-text-gradient');
1407
1786
  }
1408
- el.innerHTML = statusTextList[data.deviceStatus];
1787
+ el.innerHTML = deviceStatusMap[data.deviceStatus];
1409
1788
  return el;
1410
1789
  }
1411
1790
  };
@@ -1433,12 +1812,31 @@ function checkDeviceTypeFn(config, data) {
1433
1812
  return `${svgName}${data.onlineState === 1 || !config.props.showStatus ? '' : '_offLine'}`;
1434
1813
  }
1435
1814
  const useIcon = (config, data, node) => {
1436
- if ((['device', 'groupDevice'].includes(config.business) && data.dataType === 3)) {
1815
+ // 设备
1816
+ if ((/^(device|channel|groupDevice)$/.test(config.business) && data.dataType === 3)) {
1437
1817
  return new Icon({
1438
1818
  svgName: checkDeviceTypeFn(config, data) + '_svg'
1439
1819
  });
1440
1820
  }
1441
- else if ((config.business === 'cs' && data.dataType === 8)) {
1821
+ // 通道
1822
+ else if (config.business === Business.CHANNEL && data.dataType === 9) {
1823
+ const globalDeviceStatus = getGlobalDeviceStatus();
1824
+ // 在线
1825
+ let extendName = '', tip = globalDeviceStatus[1];
1826
+ // 离线
1827
+ if (data.deviceStatus === 0) {
1828
+ extendName = '_offLine';
1829
+ tip = globalDeviceStatus[0];
1830
+ }
1831
+ // 监控中
1832
+ else if (data.deviceStatus === 2) {
1833
+ extendName = '_monitor';
1834
+ tip = globalDeviceStatus[2];
1835
+ }
1836
+ return new Icon({ svgName: `video_channel${extendName}_svg`, width: 12, height: 12, tip });
1837
+ }
1838
+ // 采集器
1839
+ else if (config.business === 'cs' && data.dataType === 8) {
1442
1840
  return new Icon({ svgName: 'menu_acquisitionStation_svg' });
1443
1841
  }
1444
1842
  };
@@ -1464,15 +1862,20 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
1464
1862
  };
1465
1863
  }
1466
1864
 
1467
- var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOmFjee9rumhuSAqLwogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAoYnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZGV2aWNlJzoKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBEZXZpY2UnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXInOgogICAgICAgICAgICAgICAgICBjYXNlICdjcyc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChbJ2RldmljZScsICdncm91cERldmljZSddLmluY2x1ZGVzKGAke2J1c2luZXNzfWApKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDMgJiYgZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMTsKICAgICAgICAgIH07CiAgICAgICAgICB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDM7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAndXNlcicpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA1OwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ2NzJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDg7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgICBnZXRLZXksCiAgICAgICAgICBnZXRMYWJlbCwKICAgICAgICAgIGdldENoaWxkcmVuLAogICAgICAgICAgZ2V0Q291bnQsCiAgICAgICAgICBnZXRUb3RhbCwKICAgICAgICAgIGNvdW50RmlsdGVyLAogICAgICAgICAgdG90YWxGaWx0ZXIsCiAgICAgICAgICAvLyDorr7nva7orr7lpIfnirbmgIEKICAgICAgICAgIHNldERldmljZVN0YXR1czogKGRhdGEpID0+IHsKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMywgLy8g5Luj6KGo6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyh2KSAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmRldmljZVN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3Rbc29ydEJ5U3RhdHVzID8gMSA6IDBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKGdldEtleSh0YXJnZXQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0WzBdLnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcyAmJiAhaGlkZGVuTm9kZUtleVNldC5oYXMoZ2V0S2V5KHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQobm9kZS5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlICYmIGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4Torr7lpIfmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog576k57uE6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lmdyb3VwTmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDQgLy8g5Luj6KGo576k57uECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmdyb3VwTGlzdF07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZGV2TmFtZSB8fCB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMywgLy8g5Luj6KGo6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcyAmJiAhaGlkZGVuTm9kZUtleVNldC5oYXMoZ2V0S2V5KHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQobm9kZS5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlICYmIGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4TmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW59ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4TmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlR3JvdXBUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZVRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lmdyb3VwTmFtZSB8fCB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDQgLy8g5Luj6KGo576k57uECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmdyb3VwTGlzdF07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ291bnQgPSByYXdOb2RlLmRldmljZUxpc3QucmVkdWNlKCh2YWx1ZSwgdikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgKHYub25saW5lU3RhdGUgPT09IDEgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICB9LCBkZXZpY2VDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUb3RhbCA9IHJhd05vZGUuZGV2aWNlTGlzdC5sZW5ndGggfHwgMDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gZGV2aWNlVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH5ZKM576k57uE55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5aSE55CG6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCwgYnVzaW5lc3NMaXN0OiBsaXN0MiB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gZGV2aWNlQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gZGV2aWNlVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQ6IG5ldyBTZXQoKQogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlR3JvdXBUcmVlKGRhdGEpOwogIH0KICAvLyDnlKjmiLfmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgY2xlYXJFbXB0eUJ1c2luZXNzLCBpbnRlZ3JhdGVkQnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnlKjmiLfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlVXNlclRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHVzZXJNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VVc2VyTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlVXNlckxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2Lm5hbWUgfHwgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA1LCAvLyDku6PooajnlKjmiLcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOeUqOaItwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSB1c2VyTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgdXNlck1hcC5zZXQoaWQsIHVzZXJMaXN0KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgdXNlck1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZVVzZXJUcmVlKGRhdGEpOwogIH0KICAvLyDph4fpm4bnq5nmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUNzVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6YeH6ZuG56uZ5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNzVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgY3NNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jc0xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmNzTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuc25hbWUgfHwgdi5zY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA4LCAvLyDku6Pooajph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmHh+mbhuermQogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSBjc01hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIGNzTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwsIGJ1c2luZXNzTGlzdDogZGVlcEJ1c2luZXNzTGlzdCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBjc01hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUNzVHJlZShkYXRhKTsKICB9CiAgY29uc3QgZ2VuZXJhdGVNYXAgPSB7CiAgICAgIC8vIOiuvuWkh+agkQogICAgICBkZXZpY2U6IGdlbmVyYXRlRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE6K6+5aSH5qCRCiAgICAgIGdyb3VwRGV2aWNlOiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE5qCRCiAgICAgIGdyb3VwOiBnZW5lcmF0ZUdyb3VwVHJlZSwKICAgICAgLy8g55So5oi35qCRCiAgICAgIHVzZXI6IGdlbmVyYXRlVXNlclRyZWUsCiAgICAgIC8vIOmHh+mbhuermQogICAgICBjczogZ2VuZXJhdGVDc1RyZWUKICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVUcmVlLmpzLm1hcAoK');
1865
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8g5Lia5Yqh57G75Z6LKGNvbmZpZy5idXNpbmVzcykgZGV2aWNlLeiuvuWkhyBjaGFubmVsLemAmumBk+iuvuWkhyBncm91cERldmljZS3nvqTnu4Torr7lpIcgZ3JvdXAt576k57uEIHVzZXIt55So5oi3IGNzLemHh+mbhuermQogIHZhciBCdXNpbmVzczsKICAoZnVuY3Rpb24gKEJ1c2luZXNzKSB7CiAgICAgIEJ1c2luZXNzWyJERVZJQ0UiXSA9ICJkZXZpY2UiOwogICAgICBCdXNpbmVzc1siQ0hBTk5FTCJdID0gImNoYW5uZWwiOwogICAgICBCdXNpbmVzc1siR1JPVVBfREVWSUNFIl0gPSAiZ3JvdXBEZXZpY2UiOwogICAgICBCdXNpbmVzc1siR1JPVVAiXSA9ICJncm91cCI7CiAgICAgIEJ1c2luZXNzWyJVU0VSIl0gPSAidXNlciI7CiAgICAgIEJ1c2luZXNzWyJDUyJdID0gImNzIjsKICB9KShCdXNpbmVzcyB8fCAoQnVzaW5lc3MgPSB7fSkpOwogIC8vIOiuvuWkh+eKtuaAgShkYXRhLmRldmljZVN0YXR1cykgMC3nprvnur8gMS3lnKjnur8gMi3nm5HmjqfkuK0gMy3pgJror53kuK0gNC3lvZXlg4/kuK0gNS3lvZXpn7PkuK0gNi3lub/mkq3kuK0gNy1TT1MKICB2YXIgRGV2aWNlU3RhdHVzOwogIChmdW5jdGlvbiAoRGV2aWNlU3RhdHVzKSB7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIk9GRl9MSU5FIl0gPSAwXSA9ICJPRkZfTElORSI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIk9OX0xJTkUiXSA9IDFdID0gIk9OX0xJTkUiOwogICAgICBEZXZpY2VTdGF0dXNbRGV2aWNlU3RhdHVzWyJCRV9NT05JVE9SIl0gPSAyXSA9ICJCRV9NT05JVE9SIjsKICAgICAgRGV2aWNlU3RhdHVzW0RldmljZVN0YXR1c1siSU5fQ0FMTCJdID0gM10gPSAiSU5fQ0FMTCI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIklOX1ZJREVPX1JFQ09SRCJdID0gNF0gPSAiSU5fVklERU9fUkVDT1JEIjsKICAgICAgRGV2aWNlU3RhdHVzW0RldmljZVN0YXR1c1siSU5fQVVESU9fUkVDT1JEIl0gPSA1XSA9ICJJTl9BVURJT19SRUNPUkQiOwogICAgICBEZXZpY2VTdGF0dXNbRGV2aWNlU3RhdHVzWyJJTl9CUk9BRENBU0UiXSA9IDZdID0gIklOX0JST0FEQ0FTRSI7CiAgICAgIERldmljZVN0YXR1c1tEZXZpY2VTdGF0dXNbIlNPUyJdID0gN10gPSAiU09TIjsgLy8gU09TCiAgfSkoRGV2aWNlU3RhdHVzIHx8IChEZXZpY2VTdGF0dXMgPSB7fSkpOwogIC8vIOS4muWKoeaVsOaNruexu+WeiyhkYXRhLmRhdGFUeXBlKSAxLemDqOmXqCAzLeiuvuWkhyA0Lee+pOe7hCA1LeeUqOaItyA2LeiAg+WLpCA3LeawtOa6kOeCuSA4LemHh+mbhuermSA5LeiuvuWkh+mAmumBkwogIHZhciBEYXRhVHlwZTsKICAoZnVuY3Rpb24gKERhdGFUeXBlKSB7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJVTktOT1dfMSJdID0gMF0gPSAiVU5LTk9XXzEiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiREVQVCJdID0gMV0gPSAiREVQVCI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJVTktOT1dfMiJdID0gMl0gPSAiVU5LTk9XXzIiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiREVWSUNFIl0gPSAzXSA9ICJERVZJQ0UiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiR1JPVVAiXSA9IDRdID0gIkdST1VQIjsKICAgICAgRGF0YVR5cGVbRGF0YVR5cGVbIlVTRVIiXSA9IDVdID0gIlVTRVIiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiQVRURU5EQU5DRSJdID0gNl0gPSAiQVRURU5EQU5DRSI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJXQVRFUl9TT1VSQ0UiXSA9IDddID0gIldBVEVSX1NPVVJDRSI7CiAgICAgIERhdGFUeXBlW0RhdGFUeXBlWyJDUyJdID0gOF0gPSAiQ1MiOwogICAgICBEYXRhVHlwZVtEYXRhVHlwZVsiQ0hBTk5FTCJdID0gOV0gPSAiQ0hBTk5FTCI7IC8vIOiuvuWkh+mAmumBkwogIH0pKERhdGFUeXBlIHx8IChEYXRhVHlwZSA9IHt9KSk7CgogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAobm9kZS5kZXZpY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuREVQVDogLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuR1JPVVA6IC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLlVTRVI6IC8vIOeUqOaItwogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkNTOiAvLyDph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmlkOwogICAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRFVklDRTogLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5kZXZpY2VJZDsKICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5DSEFOTkVMOiAvLyDorr7lpIfpgJrpgZMKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmNoYW5uZWxJZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChidXNpbmVzcyAmJiBbQnVzaW5lc3MuREVWSUNFLCBCdXNpbmVzcy5DSEFOTkVMLCBCdXNpbmVzcy5HUk9VUF9ERVZJQ0VdLmluY2x1ZGVzKGJ1c2luZXNzKSkgewogICAgICAgICAgY291bnRGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSAzICYmIGRhdGEub25saW5lU3RhdGUgPT09IDE7CiAgICAgICAgICB9OwogICAgICAgICAgdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSAzOwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ3VzZXInKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IHRvdGFsRmlsdGVyID0gKGRhdGEpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhVHlwZSA9PT0gNTsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgZWxzZSBpZiAoYnVzaW5lc3MgPT09ICdjcycpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA4OwogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgICAgZ2V0S2V5LAogICAgICAgICAgZ2V0TGFiZWwsCiAgICAgICAgICBnZXRDaGlsZHJlbiwKICAgICAgICAgIGdldENvdW50LAogICAgICAgICAgZ2V0VG90YWwsCiAgICAgICAgICBjb3VudEZpbHRlciwKICAgICAgICAgIHRvdGFsRmlsdGVyLAogICAgICAgICAgLy8g6K6+572u6K6+5aSH54q25oCBCiAgICAgICAgICBzZXREZXZpY2VTdGF0dXM6IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgLy8g6YCa6YGT54q25oCBCiAgICAgICAgICAgICAgaWYgKGRhdGEuZGV2aWNlVHlwZSA9PT0gOSkgewogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5o6n5LitCiAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5iZU1vbml0b3IgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBoaWRkZW5Ob2RlS2V5U2V0ID0gbmV3IFNldCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZUxpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJy0nICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBkZXZpY2VNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldAogICAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gY3JlYXRlRGV2aWNlVHJlZShkYXRhKTsKICB9CiAgLy8g6YCa6YGT6K6+5aSH5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDaGFubmVsRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjaGFubmVsTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDpnZ7orr7lpIfnsbvlnosKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IERhdGFUeXBlLkRFVklDRSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogRGF0YVR5cGUuREVWSUNFLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSBEZXZpY2VTdGF0dXMuT0ZGX0xJTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChnZXRLZXkodGFyZ2V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZGV2aWNlTGlzdFswXSwgLi4uZGV2aWNlTGlzdFsxXV07CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBEYXRhVHlwZS5ERVBULCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBnZXRMYWJlbChyYXdOb2RlKSwKICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZEtleVNldC5oYXModmFsdWUpCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5ERVZJQ0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6Z2e6K6+5aSH57G75Z6L5pWw5o2uCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5ERVZJQ0UgJiYgY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSAmJiBjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSH57G75Z6L5pWw5o2u77yM5LiU5pyJ6YCa6YGT5pWw5o2u5aSE55CGCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSBEYXRhVHlwZS5ERVZJQ0UgJiYgcmF3Tm9kZS52aWRlb0NoYW5uZWxMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLnZpZGVvQ2hhbm5lbExpc3QuZm9yRWFjaCgoYykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogcmF3Tm9kZS5vbmx5SWQgKyAnLScgKyBjLmNoYW5uZWxJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGMuY2hhbm5lbE5hbWUgfHwgYy5jaGFubmVsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsZXZlbCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xlYWY6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogcmF3Tm9kZS5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldk5hbWU6IHJhd05vZGUuZGV2TmFtZSB8fCByYXdOb2RlLmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLm9ubHlJZCArICctJyArIGMuY2hhbm5lbElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGMuY2hhbm5lbE5hbWUgfHwgYy5jaGFubmVsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogRGF0YVR5cGUuQ0hBTk5FTCwgLy8g5Luj6KGo6YCa6YGTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyhjKSAvLyDorr7lpIfpgJrpgZPnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwuZGF0YS5kZXZpY2VTdGF0dXMgPT09IERldmljZVN0YXR1cy5PRkZfTElORSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaChjaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoY2hhbm5lbC5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTGlzdFswXS5wdXNoKGNoYW5uZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFwLnNldChjLmNoYW5uZWxJZCwgY2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KGNoYW5uZWwua2V5LCBjaGFubmVsKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hhbm5lbExpc3RbMF0sIC4uLmNoYW5uZWxMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGFubmVsTGlzdFswXS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gc2hvd09ubGluZVN0YXRlID8gbm9kZS5jb3VudCA6IGNoaWxkcmVuLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuREVWSUNFKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGNoYW5uZWxNYXAsCiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog576k57uE6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgLy8g576k57uECiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmNoaWxkcmVuPy5sZW5ndGggfHwKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGggfHwKICAgICAgICAgICAgICAgICAgICAgICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZ3JvdXBMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5ncm91cE5hbWUgfHwgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA0IC8vIOS7o+ihqOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cExpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5ncm91cExpc3RdOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZUxpc3QgPSBbW10sIFtdXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDMsIC8vIOS7o+ihqOiuvuWkhwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyh2KSAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmRldmljZVN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKGdldEtleSh0YXJnZXQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZGV2aWNlTGlzdFswXSwgLi4uZGV2aWNlTGlzdFsxXV07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH55qE6YOo6Zeo5ZKM576k57uEIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICAvLyDpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSAmJiBjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4TmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVufSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICAvKiog576k57uE5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUdyb3VwVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICBsZXQgZGV2aWNlVG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgKHYub25saW5lU3RhdGUgPT09IDEgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICB9LCBkZXZpY2VDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUb3RhbCA9IHJhd05vZGUuZGV2aWNlTGlzdC5sZW5ndGggfHwgMDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gZGV2aWNlVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6K6+5aSH5ZKM576k57uE55qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5aSE55CG6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGRldmljZUNvdW50OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGRldmljZVRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVHcm91cFRyZWUoZGF0YSk7CiAgfQogIC8vIOeUqOaIt+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlVXNlclRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnlKjmiLfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlVXNlclRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHVzZXJNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlVXNlckxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmRldmljZVVzZXJMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICctJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5uYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNSwgLy8g5Luj6KGo55So5oi3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJhd05vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAxLCAvLyDpg6jpl6gKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmF3Tm9kZS5vcmdOYW1lIHx8IHJhd05vZGUuY29tcGFueU5hbWUKICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS4gAogICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa55So6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0S2V5KHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICBrZXk6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmF3Tm9kZQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBub2RlLmxhYmVsID0gZ2V0TGFiZWwocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICBub2RlLmlzTGVhZiA9ICFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDA7CiAgICAgICAgICAgICAgICAgIG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZEtleVNldC5oYXModmFsdWUpOwogICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxpc3QsIGNvdW50OiBjaGlsZENvdW50LCB0b3RhbDogY2hpbGRUb3RhbCB9ID0gdHJhdmVyc2UoY2hpbGRyZW4sIGxldmVsICsgMSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LqMCiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOeUqOaItwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gNSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSB1c2VyTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgdXNlck1hcC5zZXQoaWQsIHVzZXJMaXN0KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsIH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIHVzZXJNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVVc2VyVHJlZShkYXRhKTsKICB9CiAgLy8g6YeH6ZuG56uZ5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDc1RyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDph4fpm4bnq5nmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlQ3NUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBjc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jc0xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmNzTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnLScgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuc25hbWUgfHwgdi5zY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA4LCAvLyDku6Pooajph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInph4fpm4blmajnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YeH6ZuG56uZCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyTGlzdCA9IGNzTWFwLmdldChpZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICB1c2VyTGlzdC5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgY3NNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBjc01hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUNzVHJlZShkYXRhKTsKICB9CiAgY29uc3QgZ2VuZXJhdGVNYXAgPSB7CiAgICAgIC8vIOiuvuWkh+agkQogICAgICBbQnVzaW5lc3MuREVWSUNFXTogZ2VuZXJhdGVEZXZpY2VUcmVlLAogICAgICAvLyDpgJrpgZPorr7lpIfmoJEKICAgICAgW0J1c2luZXNzLkNIQU5ORUxdOiBnZW5lcmF0ZUNoYW5uZWxEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4Torr7lpIfmoJEKICAgICAgW0J1c2luZXNzLkdST1VQX0RFVklDRV06IGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlLAogICAgICAvLyDnvqTnu4TmoJEKICAgICAgW0J1c2luZXNzLkdST1VQXTogZ2VuZXJhdGVHcm91cFRyZWUsCiAgICAgIC8vIOeUqOaIt+agkQogICAgICBbQnVzaW5lc3MuVVNFUl06IGdlbmVyYXRlVXNlclRyZWUsCiAgICAgIC8vIOmHh+mbhuermQogICAgICBbQnVzaW5lc3MuQ1NdOiBnZW5lcmF0ZUNzVHJlZQogIH07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1nZW5lcmF0ZVRyZWUuanMubWFwCgo=');
1468
1866
  /* eslint-enable */
1469
1867
 
1470
1868
  // 设备树
1471
1869
  function updateDeviceTree(tree, data, config) {
1472
1870
  const deviceMap = tree.deviceMap || new Map();
1473
1871
  let beOnlineList = [], beOfflineList = [];
1872
+ const { businessConfig, hiddenNodeKeySet } = config;
1474
1873
  const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
1475
- const { sortByStatus, showOnlineState, integratedBusiness } = config.businessConfig;
1874
+ const { sortByStatus, showOnlineState } = businessConfig;
1875
+ // 是否参与统计
1876
+ const isStatistics = (key) => {
1877
+ return !(hiddenNodeKeySet.has(key) || tree.hiddenNodeKeySet.has(key));
1878
+ };
1476
1879
  // 更新父节点统计
1477
1880
  const updateParnetCount = (keySet) => {
1478
1881
  const isCountFiler = countFilter && isFunction(countFilter);
@@ -1486,16 +1889,15 @@ function updateDeviceTree(tree, data, config) {
1486
1889
  let total = isTotalFiler ? 0 : target.data.total;
1487
1890
  const deviceList = [[], []];
1488
1891
  if (isCountFiler || isTotalFiler) {
1489
- const businessList = [];
1490
1892
  let children = target.children || [];
1491
1893
  for (let i = 0; i < children.length; i++) {
1492
1894
  const item = target.children[i];
1493
1895
  count =
1494
- isCountFiler && !tree.hiddenNodeKeySet.has(item.key) && countFilter
1896
+ isCountFiler && isStatistics(item.key) && countFilter
1495
1897
  ? count + (item.children ? item.count : countFilter(item.data))
1496
1898
  : count;
1497
1899
  total =
1498
- isTotalFiler && !tree.hiddenNodeKeySet.has(item.key) && totalFilter
1900
+ isTotalFiler && isStatistics(item.key) && totalFilter
1499
1901
  ? total + (item.children ? item.total : totalFilter(item.data))
1500
1902
  : total;
1501
1903
  if (item.data.deviceStatus === 0) {
@@ -1504,17 +1906,7 @@ function updateDeviceTree(tree, data, config) {
1504
1906
  else {
1505
1907
  deviceList[0].push(item);
1506
1908
  }
1507
- // 更新下级设备列表
1508
- if (integratedBusiness && !tree.hiddenNodeKeySet.has(item.key)) {
1509
- if (/^(1|4)$/.test(item.data.dataType)) {
1510
- businessList.push(...(item.data.childrenDeviceList || []));
1511
- }
1512
- else {
1513
- businessList.push(item.data);
1514
- }
1515
- }
1516
1909
  }
1517
- target.data.childrenDeviceList = businessList;
1518
1910
  }
1519
1911
  // 在仅显示设备时,设置 部门/群组 显示状态
1520
1912
  if (showOnlineState && count > 0) {
@@ -1561,6 +1953,130 @@ function updateDeviceTree(tree, data, config) {
1561
1953
  updateParnetCount(parentKeySet);
1562
1954
  return { tree, beOnlineList, beOfflineList };
1563
1955
  }
1956
+ // 设备通道树
1957
+ function updateDeviceChannelTree(tree, data, config) {
1958
+ const deviceMap = tree.deviceMap || new Map();
1959
+ const channelMap = tree.channelMap || new Map();
1960
+ let beOnlineList = [], beOfflineList = [];
1961
+ const { businessConfig, hiddenNodeKeySet } = config;
1962
+ const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
1963
+ const { sortByStatus, showOnlineState } = businessConfig;
1964
+ // 是否参与统计
1965
+ const isStatistics = (key) => {
1966
+ return !(hiddenNodeKeySet.has(key) || tree.hiddenNodeKeySet.has(key));
1967
+ };
1968
+ // 更新父节点统计
1969
+ const updateParnetCount = (map) => {
1970
+ const isCountFiler = countFilter && isFunction(countFilter);
1971
+ const isTotalFiler = totalFilter && isFunction(totalFilter);
1972
+ const parentMap = new Map();
1973
+ for (const [, target] of map) {
1974
+ if (!target)
1975
+ continue;
1976
+ let count = isCountFiler ? 0 : target.data.count;
1977
+ let total = isTotalFiler ? 0 : target.data.total;
1978
+ const deviceList = [[], []];
1979
+ if (isCountFiler || isTotalFiler) {
1980
+ let children = target.children || [];
1981
+ for (const item of children) {
1982
+ if (target.data.dataType !== DataType.DEVICE) {
1983
+ count =
1984
+ isCountFiler && isStatistics(item.key) && countFilter
1985
+ ? count + (item.data.dataType !== DataType.DEVICE ? item.count : countFilter(item.data))
1986
+ : count;
1987
+ total =
1988
+ isTotalFiler && isStatistics(item.key) && totalFilter
1989
+ ? total + (item.data.dataType !== DataType.DEVICE ? item.total : totalFilter(item.data))
1990
+ : total;
1991
+ }
1992
+ else {
1993
+ count += item.data.deviceStatus === DeviceStatus.OFF_LINE ? 0 : 1;
1994
+ total++;
1995
+ }
1996
+ if (item.data.deviceStatus === DeviceStatus.OFF_LINE) {
1997
+ deviceList[sortByStatus ? 1 : 0].push(item);
1998
+ }
1999
+ else {
2000
+ deviceList[0].push(item);
2001
+ }
2002
+ }
2003
+ }
2004
+ // 在仅显示设备时,设置 部门/群组 显示状态
2005
+ if (showOnlineState && count > 0 && target.data.dataType !== DataType.DEVICE) {
2006
+ tree.hiddenNodeKeySet.delete(target.key);
2007
+ }
2008
+ // target.count = target.data.dataType === DataType.DEVICE ? deviceList[0].length : count
2009
+ // target.total = showOnlineState && target.data.dataType === DataType.DEVICE ? target.count : total
2010
+ target.count = count;
2011
+ target.total = total;
2012
+ target.parent && parentMap.set(target.parent.key, target.parent);
2013
+ target.children = [...deviceList[0], ...deviceList[1]];
2014
+ }
2015
+ parentMap.size && updateParnetCount(parentMap);
2016
+ };
2017
+ const parentMap = new Map();
2018
+ data.forEach((v) => {
2019
+ // 通道
2020
+ if (v.channelId) {
2021
+ const channel = channelMap.get(v.channelId);
2022
+ if (!channel)
2023
+ return;
2024
+ Object.assign(channel, {
2025
+ data: {
2026
+ ...channel.data,
2027
+ onlyId: channel.onlyId,
2028
+ dataType: channel.data.dataType,
2029
+ deviceStatus: setDeviceStatus(v) // 设备状态
2030
+ }
2031
+ });
2032
+ // 在仅显示设备时,切换显隐状态
2033
+ if (showOnlineState) {
2034
+ if (channel.data.deviceStatus === DeviceStatus.OFF_LINE) {
2035
+ tree.hiddenNodeKeySet.add(channel.key);
2036
+ beOfflineList.push(channel);
2037
+ }
2038
+ else {
2039
+ tree.hiddenNodeKeySet.delete(channel.key);
2040
+ beOnlineList.push(channel);
2041
+ }
2042
+ }
2043
+ channel.parent && parentMap.set(channel.parent.key, channel.parent);
2044
+ }
2045
+ // 设备
2046
+ else {
2047
+ const deviceList = deviceMap.get(v.deviceId);
2048
+ if (!deviceList?.length)
2049
+ return;
2050
+ deviceList.forEach((device) => {
2051
+ const target = tree.treeNodeMap.get(device.key);
2052
+ if (!target)
2053
+ return;
2054
+ Object.assign(target, {
2055
+ data: Object.assign(target.data, {
2056
+ ...v,
2057
+ onlyId: target.key,
2058
+ dataType: target.data.dataType,
2059
+ deviceStatus: setDeviceStatus(v) // 设备状态
2060
+ })
2061
+ });
2062
+ // 在仅显示设备时,切换显隐状态
2063
+ if (showOnlineState) {
2064
+ if (target.data.deviceStatus === DeviceStatus.OFF_LINE) {
2065
+ tree.hiddenNodeKeySet.add(target.key);
2066
+ beOfflineList.push(target);
2067
+ }
2068
+ else {
2069
+ tree.hiddenNodeKeySet.delete(target.key);
2070
+ beOnlineList.push(target);
2071
+ }
2072
+ }
2073
+ target.parent && parentMap.set(target.parent.key, target.parent);
2074
+ });
2075
+ }
2076
+ });
2077
+ updateParnetCount(parentMap);
2078
+ return { tree, beOnlineList, beOfflineList };
2079
+ }
1564
2080
  // 用户树
1565
2081
  function updateUserTree(tree, data, config) {
1566
2082
  const userMap = tree.userMap || new Map();
@@ -1613,13 +2129,15 @@ function updateCsTree(tree, data, config) {
1613
2129
  }
1614
2130
  const updateTreeMap = {
1615
2131
  // 设备树
1616
- device: updateDeviceTree,
2132
+ [Business.DEVICE]: updateDeviceTree,
2133
+ // 设备通道树
2134
+ [Business.CHANNEL]: updateDeviceChannelTree,
1617
2135
  // 群组设备树
1618
- groupDevice: updateDeviceTree,
2136
+ [Business.GROUP_DEVICE]: updateDeviceTree,
1619
2137
  // 用户树
1620
- user: updateUserTree,
2138
+ [Business.USER]: updateUserTree,
1621
2139
  // 采集站
1622
- cs: updateCsTree
2140
+ [Business.CS]: updateCsTree
1623
2141
  };
1624
2142
 
1625
2143
  /** 是否显示统计 */
@@ -1640,15 +2158,22 @@ function getContainer(config) {
1640
2158
  if (isElement(container)) {
1641
2159
  el = container;
1642
2160
  }
1643
- if (el && bgColor) {
1644
- el.style.backgroundColor = bgColor;
2161
+ if (!el)
2162
+ return el;
2163
+ if (bgColor) {
2164
+ el.style.setProperty('background-color', bgColor);
1645
2165
  }
1646
- if (el && fontSize) {
1647
- el.style.fontSize = `${fontSize}px`;
2166
+ if (fontSize) {
2167
+ el.style.setProperty('font-size', `${fontSize}px`);
1648
2168
  }
1649
- if (el && color) {
1650
- el.style.color = color;
2169
+ if (color) {
2170
+ el.style.setProperty('color', color);
1651
2171
  }
2172
+ el.classList.add('hy-tree');
2173
+ el.style.setProperty('--hy-tree-item-height', `${config.itemHeight}px`);
2174
+ el.style.setProperty('--hy-tree-item-gap', `${config.itemGap}px`);
2175
+ el.style.setProperty('--hy-tree-channel-bg-color', `${config.channelBgColor}`);
2176
+ el.style.setProperty('--hy-color-placeholder', `${config.placeholderColor}`);
1652
2177
  return el;
1653
2178
  }
1654
2179
  class VirtualTree {
@@ -1703,7 +2228,6 @@ class VirtualTree {
1703
2228
  if (!this._el) {
1704
2229
  throw Error('【container参数错误】:请传入id或者class或者元素节点');
1705
2230
  }
1706
- this._el.classList.add('hy-tree');
1707
2231
  this._handleMethod = config.handleMethod;
1708
2232
  this._filterMethod = config.filterMethod;
1709
2233
  this._onNodeExpand = config.onNodeExpand;
@@ -1942,7 +2466,9 @@ class VirtualTree {
1942
2466
  return;
1943
2467
  this._tree = await this._createTree(config.data);
1944
2468
  this._flattenTree = this._genereateFlattenTree();
1945
- const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked, getCheckedKeys, getCheckedNodes,
2469
+ const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked,
2470
+ // afterNodeCheck,
2471
+ getCheckedKeys, getCheckedNodes,
1946
2472
  // getHalfCheckedKeys,
1947
2473
  // getHalfCheckedNodes,
1948
2474
  setChecked, setCheckedKeys, setCheckedNodes } = useCheck(config, this._tree);
@@ -1976,13 +2502,20 @@ class VirtualTree {
1976
2502
  const generateExpandIcon = (item) => {
1977
2503
  const el = document.createElement('div');
1978
2504
  el.classList.add('hy-tree-node__expand');
2505
+ // 通道数据
2506
+ if (item.data.dataType === 9)
2507
+ return el;
2508
+ // 其他数据
1979
2509
  if (this._expandedKeySet.has(item.key)) {
1980
2510
  el.classList.add('expanded');
1981
2511
  }
1982
2512
  const icon = document.createElement('div');
1983
2513
  icon.classList.add('hy-tree-node__expand-icon');
1984
2514
  el.appendChild(icon);
1985
- if (item.isLeaf || this._hiddenExpandIconKeySet.has(item.key)) {
2515
+ const isHideIcon = config.business !== Business.CHANNEL || item.data.dataType !== DataType.DEVICE
2516
+ ? item.isLeaf
2517
+ : this._businessConfig?.showOnlineState ? !item.count : !item.total;
2518
+ if (isHideIcon || this._hiddenExpandIconKeySet.has(item.key)) {
1986
2519
  el.style.setProperty('visibility', 'hidden');
1987
2520
  }
1988
2521
  else {
@@ -2065,35 +2598,10 @@ class VirtualTree {
2065
2598
  className = className.filter(Boolean);
2066
2599
  el.classList.add(...className);
2067
2600
  };
2068
- /** 渲染项 */
2069
- const generateItem = (item) => {
2070
- const { type, showSelect } = config.rowSelection;
2071
- let el = document.createElement('div');
2072
- el.classList.add('hy-tree-node');
2073
- if (config.itemGap) {
2074
- el.style.paddingBottom = `${config.itemGap}px`;
2075
- }
2076
- let nodeContainer = document.createElement('div');
2077
- nodeContainer.style.height = `${config.itemHeight}px`;
2078
- if (config.nodeBgColor) {
2079
- nodeContainer.style.backgroundColor = config.nodeBgColor;
2080
- }
2081
- setNodeClass(nodeContainer, item);
2082
- let content = document.createElement('div');
2083
- content.classList.add('hy-tree-node-content');
2084
- content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
2085
- // 设备离线 - 字体颜色
2086
- if (['device', 'groupDevice'].includes(config.business)
2087
- && this._props.showStatus
2088
- && item.data.dataType === 3
2089
- && item.data.deviceStatus === 0) {
2090
- content.style.color = config.placeholderColor;
2091
- }
2092
- content.appendChild(generateExpandIcon(item));
2093
- // 多选框/单选框
2094
- if ((isBoolean(showSelect)
2095
- ? showSelect
2096
- : isFunction(showSelect) && showSelect(item.data, item)) && config.rowSelection.showSelectBox) {
2601
+ /** 生成选中节点 */
2602
+ const generateCheckbox = (el, item) => {
2603
+ const { type } = config.rowSelection;
2604
+ if (isShowSelect(config, item) && config.rowSelection.showSelectBox) {
2097
2605
  if (type === 'checkbox') {
2098
2606
  new Checkbox({
2099
2607
  checked: isChecked(item),
@@ -2109,7 +2617,7 @@ class VirtualTree {
2109
2617
  }
2110
2618
  this.refresh();
2111
2619
  }
2112
- }).mount(content);
2620
+ }).mount(el);
2113
2621
  }
2114
2622
  else if (type === 'radio') {
2115
2623
  new Radio({
@@ -2120,9 +2628,36 @@ class VirtualTree {
2120
2628
  toggleCheckbox(item, checked, true, false);
2121
2629
  this.refresh();
2122
2630
  }
2123
- }).mount(content);
2631
+ }).mount(el);
2124
2632
  }
2125
2633
  }
2634
+ };
2635
+ /** 渲染项 */
2636
+ const generateItem = (item) => {
2637
+ let el = document.createElement('div');
2638
+ el.classList.add('hy-tree-node');
2639
+ if (item.data.dataType === 9) {
2640
+ el.classList.add('hy-tree-channel-node');
2641
+ }
2642
+ let nodeContainer = document.createElement('div');
2643
+ nodeContainer.style.height = `${config.itemHeight}px`;
2644
+ if (config.nodeBgColor) {
2645
+ nodeContainer.style.backgroundColor = config.nodeBgColor;
2646
+ }
2647
+ setNodeClass(nodeContainer, item);
2648
+ let content = document.createElement('div');
2649
+ content.classList.add('hy-tree-node-content');
2650
+ content.style.setProperty('padding-left', `${(item.level - 1) * (config.indent || 0)}px`);
2651
+ // 设备离线 - 字体颜色
2652
+ if ([Business.DEVICE, Business.CHANNEL, Business.GROUP_DEVICE].includes(config.business)
2653
+ && this._props.showStatus
2654
+ && /^(3|9)$/.test(item.data.dataType)
2655
+ && item.data.deviceStatus === 0) {
2656
+ content.style.color = config.placeholderColor;
2657
+ }
2658
+ content.appendChild(generateExpandIcon(item));
2659
+ // 多选框/单选框
2660
+ generateCheckbox(content, item);
2126
2661
  // 整个节点内容
2127
2662
  this._customRender(config.renderItem, item, {
2128
2663
  inset: true,
@@ -2149,9 +2684,7 @@ class VirtualTree {
2149
2684
  if (config.onNodeClick) {
2150
2685
  await config.onNodeClick(item.data, item, e);
2151
2686
  }
2152
- if (!getDisabled(config, item) && (isBoolean(showSelect)
2153
- ? showSelect
2154
- : isFunction(showSelect) && showSelect(item.data, item))) {
2687
+ if (!getDisabled(config, item) && isShowSelect(config, item)) {
2155
2688
  if (config.checkOnClickNode) {
2156
2689
  toggleCheckbox(item, !(isChecked(item) || isIndeterminate(item)), true, true);
2157
2690
  if (!config.expandOnClickNode || item.isLeaf) {
@@ -2218,9 +2751,7 @@ class VirtualTree {
2218
2751
  if (getDisabled(config, item) ||
2219
2752
  item.isLeaf ||
2220
2753
  !config.checkOnDblclickParentNode ||
2221
- !(isBoolean(showSelect)
2222
- ? showSelect
2223
- : isFunction(showSelect) && showSelect(item.data, item))) {
2754
+ !isShowSelect(config, item)) {
2224
2755
  return;
2225
2756
  }
2226
2757
  nodeClickCount = 0;
@@ -2319,7 +2850,8 @@ class VirtualTree {
2319
2850
  count: this._props.count,
2320
2851
  total: this._props.total
2321
2852
  },
2322
- businessConfig: this._businessConfig
2853
+ businessConfig: this._businessConfig,
2854
+ hiddenNodeKeySet: this._hiddenNodeKeySet
2323
2855
  });
2324
2856
  Object.assign(this._tree, tree);
2325
2857
  // 设备离线时取消勾选状态
@@ -2438,6 +2970,74 @@ class VirtualTree {
2438
2970
  : data;
2439
2971
  return this._tree ? this._tree.treeNodeMap.get(key) : undefined;
2440
2972
  };
2973
+ /** 获取设备/群组下的全部设备 */
2974
+ getDeviceIntegrated = (() => {
2975
+ const getAllDevice = (children, params, list = []) => {
2976
+ if (!children?.length)
2977
+ return list;
2978
+ const { isOnlineState = false, isFilter = false } = params;
2979
+ for (const node of children) {
2980
+ const { dataType } = node.data;
2981
+ // 过滤设备
2982
+ if (isFilter && this._hiddenNodeKeySet.has(node.key)) {
2983
+ continue;
2984
+ }
2985
+ // 筛选在线设备
2986
+ if (isOnlineState &&
2987
+ ((!/^(1|4)$/.test(dataType) && node.data.onlineState !== 1) ||
2988
+ (/^(1|4)$/.test(dataType) && !node.count))) {
2989
+ continue;
2990
+ }
2991
+ // 部门、群组
2992
+ if (/^(1|4)$/.test(dataType)) {
2993
+ getAllDevice(node?.children || [], params, list);
2994
+ continue;
2995
+ }
2996
+ // 通道
2997
+ if (dataType === 9) {
2998
+ list.push(node.data);
2999
+ continue;
3000
+ }
3001
+ // 设备
3002
+ if (dataType === 3) {
3003
+ if (node.count) {
3004
+ getAllDevice(node?.children || [], params, list);
3005
+ }
3006
+ else {
3007
+ list.push(node.data);
3008
+ }
3009
+ continue;
3010
+ }
3011
+ // 其他类型
3012
+ list.push(node.data);
3013
+ }
3014
+ return list;
3015
+ };
3016
+ return (params) => {
3017
+ const { id, isBusiness = false } = params;
3018
+ if (!id)
3019
+ return;
3020
+ let node;
3021
+ if (isBusiness && this._business) {
3022
+ switch (this._business) {
3023
+ case Business.DEVICE:
3024
+ case Business.CHANNEL:
3025
+ case Business.GROUP_DEVICE:
3026
+ node = (this._tree.deviceMap && this._tree.deviceMap.get(id)) || [];
3027
+ break;
3028
+ case Business.USER:
3029
+ node = (this._tree.userMap && this._tree.userMap.get(id)) || [];
3030
+ break;
3031
+ case Business.CS:
3032
+ node = (this._tree.csMap && this._tree.csMap.get(id)) || [];
3033
+ break;
3034
+ }
3035
+ node = node?.[0];
3036
+ }
3037
+ node = node || this._tree.treeNodeMap.get(params.id);
3038
+ return getAllDevice(node?.children || [], params);
3039
+ };
3040
+ })();
2441
3041
  /** 设置展开的节点 */
2442
3042
  setExpandedKeys = (keys) => {
2443
3043
  const expandedKeys = new Set();
@@ -2518,4 +3118,4 @@ class VirtualTree {
2518
3118
  };
2519
3119
  }
2520
3120
 
2521
- export { VirtualScroll, VirtualTree, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined };
3121
+ export { Business, DataType, DeviceStatus, VirtualScroll, VirtualTree, getGlobalDeviceStatus, isArray, isBoolean, isElement, isEmpty, isFunction, isNull, isNumber, isObject, isString, isUndefined, setGlobalDeviceStatus };