UNPKG

p3x-redis-ui-material

Version:

💿 The p3x-redis-ui-material web interface that connects to the p3x-redis-ui-server via http and socket.io

1 lines 191 kB
(()=>{var e,t,n,o,r,i,s,a={9862:e=>{e.exports='<md-dialog class="fullscreen-dialog"> <form novalidate name="p3xrConnectionForm" ng-submit="submit()"> <md-toolbar md-theme="{{ $root.p3xr.state.themeLayout }}" class="md-hue-3"> <div class="md-toolbar-tools"> <h2 flex md-truncate>{{ $root.p3xr.state.cfg.readonlyConnections ? $root.p3xr.strings.label.connectiondView : options.type === \'new\' ? $root.p3xr.strings.label.connectiondAdd : $root.p3xr.strings.label.connectiondEdit }}</h2> <md-button class="md-icon-button" ng-click="cancel()"> <md-icon>close</md-icon> </md-button> </div> </md-toolbar> <md-dialog-content md-theme="{{ $root.p3xr.state.theme }}"> <md-content> <div class="p3xr-padding"> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.connection.label.name }}</label> <input required name="name" ng-model="model.name" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> <div ng-messages="p3xrConnectionForm.name.$error"> <div ng-message="required">{{ $root.p3xr.strings.form.error.required }}</div> </div> </md-input-container> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.connection.label.host }}</label> <input name="host" ng-model="model.host" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> </md-input-container> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.connection.label.port }}</label> <input name="port" type="number" min="1" max="65535" ng-model="model.port" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> <div ng-messages="p3xrConnectionForm.port.$error"> <div ng-message-exp="[\'min\', \'max\']"> {{ $root.p3xr.strings.form.error.port }} </div> </div> </md-input-container> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.form.connection.label.password }}</label> <input name="password" type="password" ng-model="model.password" ng-disabled="$root.p3xr.state.cfg.readonlyConnections" autocomplete="off"> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.label.passwordSecure }} </div> <span ng-if="$root.p3xr.state.donated"> <md-input-container style="margin:0"> <md-switch ng-model="model.readonly" name="readonly" aria-label="" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> {{ model.readonly ? $root.p3xr.strings.label.readonly.on : $root.p3xr.strings.label.readonly.off }} </md-switch> </md-input-container> <md-input-container style="margin:0"> <md-switch ng-model="model.awsElastiCache" name="awsElastiCache" aria-label="" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> {{ model.awsElastiCache ? $root.p3xr.strings.label.awsElastiCache.on : $root.p3xr.strings.label.awsElastiCache.off }} </md-switch> </md-input-container> <md-input-container style="margin:0"> <md-switch ng-model="model.azure" name="azure" aria-label="" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> {{ model.azure ? $root.p3xr.strings.label.azure.on : $root.p3xr.strings.label.azure.off }} </md-switch> </md-input-container> <md-input-container style="margin:0"> <md-switch ng-model="model.cluster" name="cluster" aria-label="" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> {{ model.cluster ? $root.p3xr.strings.label.cluster.on : $root.p3xr.strings.label.cluster.off }} </md-switch> </md-input-container> <span ng-if="model.cluster === true && !$root.p3xr.state.cfg.readonlyConnections" ng-click="addNode()"> <md-button class="md-fab md-primary md-mini"> <md-icon>add</md-icon> </md-button> {{ $root.p3xr.strings.label.addNode }} </span> <div ng-if="model.cluster === true"> <div ng-repeat="node in model.nodes"> <fieldset> <legend>Node {{$index + 1}}</legend> <div style="float:right" ng-if="!$root.p3xr.state.cfg.readonlyConnections"> <md-button class="md-fab md-warn md-mini" ng-click="removeNode($event, $index)"> <md-tooltip>{{ $root.p3xr.strings.confirm.deleteConnectionText }}</md-tooltip> <md-icon>delete</md-icon> </md-button> <md-button class="md-fab md-primary md-mini" ng-click="addNode($index)"> <md-tooltip>{{ $root.p3xr.strings.label.addNode }}</md-tooltip> <md-icon>add</md-icon> </md-button> </div> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.connection.label.host }}</label> <input name="host{{$index}}" ng-model="node.host" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> </md-input-container> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.connection.label.port }}</label> <input required name="port{{$index}}" type="number" min="1" max="65535" ng-model="node.port" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> <div ng-messages="p3xrConnectionForm[\'port\' +  $index].$error"> <div ng-message-exp="[\'min\', \'max\']"> {{ $root.p3xr.strings.form.error.port }} </div> <div ng-message="required">{{ $root.p3xr.strings.form.error.required }}</div> </div> </md-input-container> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.form.connection.label.password }}</label> <input name="password{{$index}}" type="password" ng-model="node.password" ng-disabled="$root.p3xr.state.cfg.readonlyConnections"> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.label.passwordSecure }} </div> </fieldset> <div ng-if="$last !== true" style="margin-bottom:16px"> &nbsp; </div> <div style="clear:both"></div> </div> </div> </span> </div> </md-content> </md-dialog-content> <md-dialog-actions md-theme="{{ $root.p3xr.state.theme }}" class="p3xr-dialog-connection-actions"> <md-button class="md-raised md-warn" ng-click="cancel()" md-autofocus> <md-icon>cancel</md-icon> <span ng-if="$root.$mdMedia(\'(min-width: 699px)\')">{{ $root.p3xr.strings.intention.cancel }}</span> <md-tooltip ng-if="$root.$mdMedia(\'(max-width: 699px)\')" md-direction="top">{{ $root.p3xr.strings.intention.cancel }} </md-tooltip> </md-button> <span md-theme="{{ $root.p3xr.state.themeCommon }}"> <md-button class="md-raised md-primary" ng-click="testConnection()"> <i class="fas fa-plug"></i> {{ $root.p3xr.strings.intention.testConnection }} </md-button> </span> <md-button class="md-raised md-primary" type="submit" ng-if="!$root.p3xr.state.cfg.readonlyConnections"> <md-icon>{{ options.type === \'new\' ? \'add\' : \'save\' }}</md-icon> {{ options.type === \'new\' ? $root.p3xr.strings.intention.add : $root.p3xr.strings.intention.save }} </md-button> </md-dialog-actions> </form> </md-dialog> '},8133:e=>{e.exports='<md-dialog aria-label="{{ $root.p3xr.strings.intention.jsonViewShow }}" class="fullscreen-dialog fullscreen-dialog-fix-width"> <md-toolbar md-theme="{{$root.p3xr.state.themeLayout}}" class="md-hue-3"> <div class="md-toolbar-tools"> <md-icon>edit</md-icon> &nbsp; {{ $root.p3xr.strings.intention.jsonViewEditor }} <span flex></span> <md-button class="md-icon-button" ng-click="ok()" aria-label="{{ $root.p3xr.strings.intention.close }}"> <md-icon>close</md-icon> </md-button> </div> </md-toolbar> <md-dialog-content flex md-theme="{{ $root.p3xr.state.theme }}" class="p3xr-roboto-monospace" style="height:100vh"> <md-content style="height:100%"> <div ng-if="!isJson" layout-padding> {{ $root.p3xr.strings.label.jsonViewNotParsable}} </div> <div ng-if="isJson" id="p3xr-jsoneditor" style="width:100%;height:100%"></div> </md-content> </md-dialog-content> <md-dialog-actions md-theme="{{ $root.p3xr.state.theme }}"> <md-button ng-click="ok()" class="md-raised md-warn" aria-label="{{ $root.p3xr.strings.intention.close }}" md-autofocus> <md-icon>cancel</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.cancel }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="top">{{ $root.p3xr.strings.intention.cancel }}</md-tooltip> </md-button> <md-button ng-if="isJson && $root.p3xr.state.connection.readonly !== true" class="md-raised md-primary" ng-click="save({ format : false})"> <md-icon>save</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.save }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="top">{{ $root.p3xr.strings.intention.save }}</md-tooltip> </md-button> <md-button ng-if="isJson && $root.p3xr.state.connection.readonly !== true" class="md-raised md-primary" ng-click="save({ format : true})"> <md-icon>save</md-icon> <md-icon>format_line_spacing</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.saveWithFormatJson }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="top">{{ $root.p3xr.strings.intention.saveWithFormatJson }}</md-tooltip> </md-button> </md-dialog-actions>  </md-dialog> '},3857:e=>{e.exports='<md-dialog aria-label="{{ $root.p3xr.strings.intention.jsonViewShow }}" class="fullscreen-dialog"> <md-toolbar md-theme="{{$root.p3xr.state.themeLayout}}"> <div class="md-toolbar-tools"> <md-icon>table_chart</md-icon> &nbsp; {{ $root.p3xr.strings.intention.jsonViewShow }} <span flex></span> <md-button class="md-icon-button" aria-label="" ng-if="isJson" ng-click="treeExpandAll()"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.expandAll}}</md-tooltip> <md-icon>keyboard_arrow_down</md-icon> </md-button> <md-button class="md-icon-button" aria-label="" ng-if="isJson" ng-click="treeCollapseAll()"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.collapseAll}}</md-tooltip> <md-icon>keyboard_arrow_up</md-icon> </md-button> <md-button class="md-icon-button" ng-click="ok()" aria-label="{{ $root.p3xr.strings.intention.close }}"> <md-icon>close</md-icon> </md-button> </div> </md-toolbar> <md-dialog-content flex md-theme="{{ $root.p3xr.state.theme }}"> <md-content class="p3xr-roboto-monospace"> <div class="p3xr-padding"> <json-tree object="obj" root-name="$root.p3xr.strings.label.tree" ng-if="isJson && howExpanded === true" start-expanded="howExpanded"></json-tree> <json-tree object="obj" root-name="$root.p3xr.strings.label.tree" ng-if="isJson && howExpanded === \'recursive\'" start-expanded="howExpanded"></json-tree> <div ng-if="!isJson"> {{ $root.p3xr.strings.label.jsonViewNotParsable}} </div> </div> </md-content> </md-dialog-content> <md-dialog-actions md-theme="{{ $root.p3xr.state.theme }}"> <md-button ng-click="ok()" class="md-raised md-accent" aria-label="{{ $root.p3xr.strings.intention.close }}" md-autofocus> <md-icon>close</md-icon> {{ $root.p3xr.strings.intention.close }} </md-button> </md-dialog-actions>  </md-dialog> '},5817:e=>{e.exports='<md-dialog aria-label="{{$root.p3xr.strings.form.key.label.formName}}" class="fullscreen-dialog fullscreen-dialog-fix-width"> <form novalidate name="p3xrKeyNewForm" ng-submit="submit()"> <md-toolbar md-theme="{{ $root.p3xr.state.themeLayout }}" class="md-hue-3"> <div class="md-toolbar-tools"> <h2 flex md-truncate> {{ options.type === \'edit\' ? $root.p3xr.strings.form.key.label.formName.edit : ( options.type === \'append\' ? $root.p3xr.strings.form.key.label.formName.append : $root.p3xr.strings.form.key.label.formName.add ) }} </h2> <md-button class="md-icon-button" ng-click="cancel()"> <md-icon>close</md-icon> </md-button> </div> </md-toolbar> <md-dialog-content md-theme="{{ $root.p3xr.state.theme }}"> <md-content> <div class="p3xr-padding"> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.key.field.key }}</label> <input required minlength="1" ng-model="model.key" name="key" ng-disabled="options.type !== \'add\'"> <div ng-messages="p3xrKeyNewForm.key.$error"> <div ng-message-exp="[\'required\', \'minlength\']"> {{ $root.p3xr.strings.form.key.error.key }} </div> </div> </md-input-container> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.key.field.type }}</label> <md-select ng-model="model.type" name="type" ng-disabled="options.type !== \'add\'"> <md-option ng-repeat="type in types" ng-value="type"> {{ $root.p3xr.strings.redisTypes[type] }} </md-option> </md-select> </md-input-container> <span ng-switch="model.type"> <span ng-switch-when="list"> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.form.key.field.index }}</label> <input type="number" step="1" ng-model="model.index" name="index"> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.label.redisListIndexInfo }} </div> </span> <span ng-switch-when="hash"> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.key.field.hashKey }}</label> <input required minlength="1" ng-model="model.hashKey" name="hashKey"> <div ng-messages="p3xrKeyNewForm.hashKey.$error"> <div ng-message-exp="[\'required\', \'minlength\']"> {{ $root.p3xr.strings.form.key.error.hashKey }} </div> </div> </md-input-container> </span> <span ng-switch-when="zset"> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.key.field.score }}</label> <input type="number" required ng-model="model.score" name="score"> <div ng-messages="p3xrKeyNewForm.score.$error"> <div ng-message-exp="[\'required\']"> {{ $root.p3xr.strings.form.key.error.score }} </div> </div> </md-input-container> </span> </span> <md-button class="md-button md-raised md-primary" ng-if="$root.p3xr.state.donated" ng-click="jsonEditor({ $event: $event, value: model.value})"> <i class="fas fa-file-alt"></i> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.jsonViewEditor }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.jsonViewEditor }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-primary" ng-click="formatJson({ $event: $event})"> <md-icon>format_line_spacing</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.formatJson }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.formatJson }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-accent" ng-click="jsonViewer({ $event: $event, value: model.value})"> <md-icon>table_chart</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.jsonViewShow }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.jsonViewShow }} </md-tooltip> </md-button> <md-button class="md-icon-button md-accent" ng-click="copy({ $event: $event, value: model.value})"> <md-tooltip>{{ $root.p3xr.strings.intention.copy }}</md-tooltip> <md-icon>content_copy</md-icon> </md-button> <md-switch ng-model="validateJson" class="md-accent" style="margin-top:0"> {{ $root.p3xr.strings.label.validateJson }} </md-switch> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.form.key.field.value }}</label> <textarea ng-model="model.value" required p3x-validate-json p3x-validate-json-required="validateJson" name="value"></textarea> <div ng-messages="p3xrKeyNewForm.value.$error"> <div ng-message-exp="[\'required\']"> {{ $root.p3xr.strings.form.key.error.value }} </div> </div> <div ng-messages="p3xrKeyNewForm.value.$error"> <div ng-message-exp="[\'p3xValidateJson\']"> {{ $root.p3xr.strings.label.jsonViewNotParsable }} </div> </div> </md-input-container> </div> </md-content> </md-dialog-content> <md-dialog-actions md-theme="{{ $root.p3xr.state.theme }}"> <md-button class="md-raised md-warn" ng-click="cancel()" md-autofocus> <md-icon>cancel</md-icon> {{ $root.p3xr.strings.intention.cancel }} </md-button> <md-button class="md-raised md-primary" type="submit" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-icon>{{ options.type === \'edit\' ? \'edit\' : \'add\'}}</md-icon> {{ options.type === \'edit\' ? $root.p3xr.strings.intention.save : $root.p3xr.strings.intention.add }} </md-button> </md-dialog-actions> </form> </md-dialog> '},526:e=>{e.exports='<md-dialog class="fullscreen-dialog"> <form novalidate name="p3xrDialogTreecontrolSettingsForm" ng-submit="submit()"> <md-toolbar md-theme="{{ $root.p3xr.state.themeLayout }}" class="md-hue-3"> <div class="md-toolbar-tools"> <h2 flex md-truncate>{{$root.p3xr.strings.form.treeSettings.label.formName}}</h2> <md-button class="md-icon-button" ng-click="cancel()"> <md-icon>close</md-icon> </md-button> </div> </md-toolbar> <md-dialog-content md-theme="{{ $root.p3xr.state.theme }}"> <md-content> <div class="p3xr-padding"> <div ng-if="$root.p3xr.state.reducedFunctions"> <div> {{ $root.p3xr.strings.form.treeSettings.keyCount() }} </div> <br/> <div> {{ $root.p3xr.strings.label.tooManyKeys({ count: $root.p3xr.state.keysRaw.length, maxLightKeysCount: $root.p3xr.settings.maxLightKeysCount}) }} </div> <br/> </div> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.form.treeSettings.field.treeSeparator }}</label> <input name="treeSeparator" ng-model="model.treeSeparator"> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.label.treeSeparatorEmpty }} </div> <br/> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.form.treeSettings.field.page }}</label> <input type="number" required min="10" max="1000" name="pageCount" step="1" pattern="\\d*" ng-model="model.pageCount"> <div ng-messages="p3xrDialogTreecontrolSettingsForm.pageCount.$error"> <div ng-message-exp="[\'required\', \'min\', \'max\', \'pattern\']"> {{ $root.p3xr.strings.form.treeSettings.error.page }} </div> </div> </md-input-container> <br/> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.form.treeSettings.maxValueDisplay }}</label> <input type="number" required min="-1" max="32768" name="maxValueDisplay" step="1" pattern="-?\\d*" ng-model="model.maxValueDisplay"> <div ng-messages="p3xrDialogTreecontrolSettingsForm.maxValueDisplay.$error"> <div ng-message-exp="[\'required\', \'min\', \'max\', \'pattern\']"> {{ $root.p3xr.strings.form.treeSettings.error.maxValueDisplay }} </div> </div> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.form.treeSettings.maxValueDisplayInfo }} </div> <br/> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.form.treeSettings.maxKeys }}</label> <input type="number" required min="5" max="100000" name="maxKeys" step="1" pattern="-?\\d*" ng-model="model.maxKeys"> <div ng-messages="p3xrDialogTreecontrolSettingsForm.maxKeys.$error"> <div ng-message-exp="[\'required\', \'min\', \'max\', \'pattern\']"> {{ $root.p3xr.strings.form.treeSettings.error.maxKeys }} </div> </div> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.form.treeSettings.maxKeysInfo }} </div> <span ng-if="!$root.p3xr.state.reducedFunctions" style="margin:0;padding:0"> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <md-switch ng-model="model.keysSort" name="keysSort" aria-label="" class="p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> {{ model.keysSort ? $root.p3xr.strings.label.keysSort.on : $root.p3xr.strings.label.keysSort.off }} </md-switch> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.label.treeKeyStore }} </div> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <md-switch ng-model="model.searchClientSide" name="searchClientSide" aria-label="" ng-disabled="$root.p3xr.state.dbsize > $root.p3xr.settings.maxLightKeysCount" class="p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> {{ model.searchClientSide ? $root.p3xr.strings.form.treeSettings.label.searchModeClient : $root.p3xr.strings.form.treeSettings.label.searchModeServer }} </md-switch> </md-input-container> <div class="p3xr-md-input-container-bottom-info"> {{ $root.p3xr.strings.page.treeControls.search.info }} <div ng-if="$root.p3xr.state.dbsize > $root.p3xr.settings.maxLightKeysCount "> <br/> {{ $root.p3xr.strings.page.treeControls.search.largeSetInfo }} </div> </div> </span> <br/> <md-input-container class="md-block p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> <md-switch ng-model="model.searchStartsWith" name="searchStartsWith" aria-label="" class="p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> {{ model.searchStartsWith ? $root.p3xr.strings.form.treeSettings.label.searchModeStartsWith : $root.p3xr.strings.form.treeSettings.label.searchModeIncludes }} </md-switch> </md-input-container> <md-input-container class="md-block p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> <md-switch ng-model="model.jsonFormat" name="jsonFormat" aria-label="" class="p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> {{ model.jsonFormat ? $root.p3xr.strings.form.treeSettings.label.jsonFormatTwoSpace : $root.p3xr.strings.form.treeSettings.label.jsonFormatFourSpace }} </md-switch> </md-input-container> <md-input-container class="md-block p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> <md-switch ng-model="model.animation" name="animation" aria-label="" class="p3xr-md-input-container-no-bottom p3xr-md-input-container-no-top"> {{ model.animation ? $root.p3xr.strings.form.treeSettings.label.animation : $root.p3xr.strings.form.treeSettings.label.noAnimation }} </md-switch> </md-input-container> </div> </md-content> </md-dialog-content> <md-dialog-actions md-theme="{{ $root.p3xr.state.theme }}"> <md-button class="md-raised md-warn" ng-click="cancel()" md-autofocus> <md-icon>cancel</md-icon> {{ $root.p3xr.strings.intention.cancel }} </md-button> <md-button class="md-raised md-primary" type="submit"> <md-icon>save</md-icon> {{ $root.p3xr.strings.intention.save }} </md-button> </md-dialog-actions> </form> </md-dialog> '},5006:e=>{e.exports='<md-dialog> <form novalidate name="p3xrTtlForm" ng-submit="submit()"> <md-toolbar md-theme="{{ $root.p3xr.state.themeLayout }}" class="md-hue-3"> <div class="md-toolbar-tools"> <h2 flex md-truncate>{{ $root.p3xr.strings.confirm.ttl.title}}</h2> <md-button class="md-icon-button" ng-click="cancel()"> <md-icon>close</md-icon> </md-button> </div> </md-toolbar> <md-dialog-content md-theme="{{ $root.p3xr.state.theme }}"> <md-content class="p3xr-padding"> <div class="md-text"> {{ $root.p3xr.strings.confirm.ttl.textContent }} </div> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.confirm.ttl.placeholder }}</label> <input type="number" name="ttl" ng-model="model.ttl" min="-1" placeholder="{{ $root.p3xr.strings.confirm.ttl.placeholderPlaceholder }}"> <div ng-messages="p3xrTtlForm.ttl.$error"> </div> </md-input-container> <md-input-container class="md-block p3xr-md-input-container-no-bottom"> <label>{{ $root.p3xr.strings.confirm.ttl.convertTextToTime }}</label> <input name="convertTextToTime" ng-model="convertTextToTime" placeholder="{{ $root.p3xr.strings.confirm.ttl.convertTextToTimePlaceholder}}"> <div ng-messages="p3xrTtlForm.convertTextToTime.$error"> </div> </md-input-container> <md-button ng-click="openTimestringNpm()" class="md-accent">https://www.npmjs.com/package/timestring</md-button> </md-content> </md-dialog-content> <md-dialog-actions md-theme="{{ $root.p3xr.state.theme }}"> <md-button class="md-raised md-warn" ng-click="cancel()" md-autofocus> <md-icon>cancel</md-icon> {{ $root.p3xr.strings.intention.cancel }} </md-button> <md-button class="md-raised md-primary" type="submit"> <md-icon>timer</md-icon> {{ $root.p3xr.strings.intention.ttl }} </md-button> </md-dialog-actions> </form> </md-dialog> '},134:e=>{e.exports=' <div id="p3xr-layout-header-container"> <md-toolbar md-whiteframe="3"> <div class="md-toolbar-tools"> <p3xr-button ng-if="!$root.p3xr.state.failed" ui-sref="main.statistics" p3xr-label="$root.p3xr.strings.title.name" p3xr-fa-icon="fas fa-database"></p3xr-button> <p3xr-button ng-if="$root.p3xr.state.failed" ng-click="$root.locationReload()" p3xr-label="$root.p3xr.strings.title.name" p3xr-fa-icon="fas fa-redo"></p3xr-button> <span flex></span> <p3xr-button ng-if="!$root.p3xr.state.failed" ui-sref="settings" p3xr-label="$root.p3xr.strings.intention.settings" p3xr-md-icon="settings"></p3xr-button> <p3xr-button ng-if="$root.p3xr.state.connection" ui-sref="console" p3xr-label="$root.p3xr.strings.intention.console" p3xr-md-icon="keyboard"></p3xr-button> <p3xr-button ng-if="$root.p3xr.state.connection" ui-sref="main.statistics" p3xr-label="$root.p3xr.strings.intention.main" p3xr-md-icon="home"></p3xr-button> </div> </md-toolbar> </div> <div id="p3xr-layout-header-version-donated" md-colors="{ color: $ctrl.getVersionColor() }" ng-if="$root.isElectron === false && $root.p3xr.state.donated && $root.$mdMedia(\'(min-width: 699px)\')">{{ $root.p3xr.state.version }} </div> <div id="p3xr-layout-header-version-free" md-colors="{ color: $ctrl.getVersionColor() }" ng-if="$root.isElectron === false && !$root.p3xr.state.donated && $root.$mdMedia(\'(min-width: 699px)\')">{{ $root.p3xr.state.version }} </div> <div id="p3xr-layout-footer-container"> <md-toolbar> <div class="md-toolbar-tools"> <md-menu ng-if="$root.p3xr.state.connections.list.length > 0"> <p3xr-button ng-click="$mdMenu.open($event)" p3xr-label="$ctrl.connectionName" p3xr-md-icon="power" p3xr-tooltip-direction="top"></p3xr-button> <md-menu-content> <md-menu-item ng-repeat="connection in $root.p3xr.state.connections.list" ng-class="{\'p3xr-md-menu-item-selected\': $root.p3xr.state.connection.id  === connection.id}"> <md-button ng-click="$ctrl.connect(connection, true)"> {{ connection.name }} </md-button> </md-menu-item> </md-menu-content> </md-menu> <span ng-if="$root.p3xr.state.connection"> <md-button ng-click="$ctrl.disconnect()"> <i class="fa fa-power-off"></i> <span hide-xs hide-sm>{{ $root.p3xr.strings.intention.disconnect }}</span> <md-tooltip ng-if="$root.$mdMedia(\'xs\') || $root.$mdMedia(\'sm\')" md-direction="top">{{ $root.p3xr.strings.intention.disconnect }} </md-tooltip> </md-button> </span> <span flex></span> <p3xr-button ng-click="$ctrl.openLink.donate()" p3xr-label="$root.p3xr.strings.title.donate" p3xr-fa-icon="fas fa-donate" p3xr-tooltip-direction="top"></p3xr-button> <md-menu ng-if="!$root.isElectron || ($root.isElectron && $ctrl.isElectronInitialized)"> <md-button ng-click="$mdMenu.open($event)"> <md-icon>language</md-icon> <span hide-xs hide-sm>{{ $root.p3xr.strings.intention.language }}</span> <md-tooltip ng-if="$root.$mdMedia(\'xs\') || $root.$mdMedia(\'sm\')" md-direction="top">{{ $root.p3xr.strings.intention.language }} </md-tooltip> </md-button> <md-menu-content> <md-menu-item ng-repeat="(key, value) in $root.p3xr.strings.language" ng-class="{\'p3xr-md-menu-item-selected\': $root.p3xr.settings.language.current === key}"> <md-button ng-click="$ctrl.setLanguage(key)"> {{ $root.p3xr.strings.language[key] }} </md-button> </md-menu-item> </md-menu-content> </md-menu> <md-menu> <md-button ng-click="$mdMenu.open($event)"> <md-icon>color_lens</md-icon> <span hide-xs>{{ $root.p3xr.strings.intention.theme }}</span> <md-tooltip ng-if="$root.$mdMedia(\'xs\')" md-direction="top">{{ $root.p3xr.strings.intention.theme }} </md-tooltip> </md-button> <md-menu-content> <md-menu-item ng-repeat="key in $ctrl.getThemeKey($root.p3xr.theme)" ng-class="{\'p3xr-md-menu-item-selected\': $ctrl.themeSelectedKey === key}"> <md-button ng-click="$ctrl.setTheme(key)"> {{ $root.p3xr.strings.label.theme[key] }} </md-button> </md-menu-item> </md-menu-content> </md-menu> <md-menu> <md-button ng-click="$mdMenu.open($event)"> <i class="fab fa-github"></i> <span hide-xs hide-sm>{{ $root.p3xr.strings.intention.github }}</span> <md-tooltip ng-if="$root.$mdMedia(\'xs\') || $root.$mdMedia(\'sm\')" md-direction="top">{{ $root.p3xr.strings.intention.github }} </md-tooltip> </md-button> <md-menu-content> <md-menu-item> <md-button ng-click="$ctrl.openLink.github()"> {{ $root.p3xr.strings.intention.githubRepo }} </md-button> </md-menu-item> <md-menu-item> <md-button ng-click="$ctrl.openLink.githubRelease()"> {{ $root.p3xr.strings.intention.githubRelease }} </md-button> </md-menu-item> <md-menu-item> <md-button ng-click="$ctrl.openLink.githubChangelog()"> {{ $root.p3xr.strings.intention.githubChangelog }} </md-button> </md-menu-item> </md-menu-content> </md-menu> </div> </md-toolbar> </div> <div flex layout="row"> <div flex class="p3xr-layout-content"> <ui-view></ui-view> </div> </div> <div id="p3xr-layout-reduced" ng-show="$root.p3xr.state.reducedFunctions" md-theme="{{ $root.p3xr.state.themeCommon }}" md-colors="{ background: \'warn\', \'border-color\': \'warn-900-0.5\'}" ng-click="$ctrl.reducedFunctionalty()"> <md-icon style="font-size:20px">warning</md-icon> {{ $root.p3xr.strings.label.reducedFunction }} </div> '},176:e=>{e.exports='<div layout-gt-xs="row" layout="column" layout-align-gt-sm="start center" layout-align="center center" md-colors="{ background: \'primary-300\' }"> <div flex="20"><span ng-if="!$root.$mdMedia(\'xs\')">&nbsp;</span>{{ $root.p3xr.strings.page.key.hash.table.hashkey }}</div> <div flex="60"> {{ $root.p3xr.strings.page.key.hash.table.value }} </div> <div flex="20" style="text-align:right" class="p3xr-connected-readonly-filler"> <md-button class="md-icon-button" ng-click="$ctrl.addHash({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.add }}</md-tooltip> <md-icon>add</md-icon> </md-button> </div> </div> <div layout-gt-xs="row" layout="column" layout-align-gt-sm="start start" layout-align="center center" ng-repeat="(key, value) in $ctrl.p3xrValue" ng-class="{ \'p3xr-list-key-odd-item\': $odd }" class="p3xr-list-key-item"> <div flex="20" ng-click="$ctrl.editValue({ hashKey: key, value: value, $event: $event})"><span ng-if="!$root.$mdMedia(\'xs\')">&nbsp;</span><span ng-if="$root.p3xr.settings.maxValueDisplay > 0 && key.length > $root.p3xr.settings.maxValueDisplay">{{ key.substring(0, $root.p3xr.settings.maxValueDisplay) }}...</span><span ng-if="$root.p3xr.settings.maxValueDisplay === 0 || key.length <= $root.p3xr.settings.maxValueDisplay || $root.p3xr.settings.maxValueDisplay === -1 ">{{ key }}</span></div> <div flex="60" class="p3xr-pre" style="overflow:auto;align-items:flex-start;max-height:200px" ng-click="$ctrl.editValue({ hashKey: key, value: value, $event: $event})"><span ng-if="$root.p3xr.settings.maxValueDisplay > 0 && value.length > $root.p3xr.settings.maxValueDisplay">{{ value.substring(0, $root.p3xr.settings.maxValueDisplay) }}...</span><span ng-if="$root.p3xr.settings.maxValueDisplay === 0 || value.length <= $root.p3xr.settings.maxValueDisplay || $root.p3xr.settings.maxValueDisplay === -1 ">{{ value }}</span></div> <div flex="20" style="text-align:right"> <md-button class="md-icon-button md-warn" ng-click="$ctrl.deleteHashKey({ hashKey: key, $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.delete }}</md-tooltip> <md-icon>delete</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.showJson({ value: value})"> <md-tooltip>{{ $root.p3xr.strings.intention.jsonViewShow }}</md-tooltip> <md-icon>table_chart</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.copy({ $event: $event, value: value})"> <md-tooltip>{{ $root.p3xr.strings.intention.copy }}</md-tooltip> <md-icon>content_copy</md-icon> </md-button> <md-button class="md-icon-button md-primary" ng-click="$ctrl.editValue({ hashKey: key, value: value, $event: $event})"> <md-tooltip>{{ $root.p3xr.strings.intention.edit }}</md-tooltip> <md-icon>edit</md-icon> </md-button> </div> </div> '},2585:e=>{e.exports='<div layout-gt-xs="row" layout="column" layout-align-gt-sm="start center" layout-align="center center" md-colors="{ background: \'primary-300\' }"> <div flex="20"> <span ng-if="!$root.$mdMedia(\'xs\')">&nbsp;</span> {{ $root.p3xr.strings.page.key.list.table.index }} </div> <div flex="60"> {{ $root.p3xr.strings.page.key.list.table.value }} </div> <div flex="20" style="text-align:right" class="p3xr-connected-readonly-filler"> <md-button class="md-icon-button" ng-click="$ctrl.appendValue({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.add }}</md-tooltip> <md-icon>add</md-icon> </md-button> </div> </div> <div layout-gt-xs="row" layout="column" layout-align-gt-sm="start start" layout-align="center center" ng-repeat="value in $ctrl.p3xrValue track by $index" ng-class="{ \'p3xr-list-key-odd-item\': $odd }" class="p3xr-list-key-item"> <div flex="20" ng-click="$ctrl.editValue({ index: $index, value: value, $event: $event})"> <span ng-if="!$root.$mdMedia(\'xs\')">&nbsp;</span> {{ $index }} </div> <div flex="60" class="p3xr-pre" style="overflow:auto;align-items:flex-start;max-height:200px" ng-click="$ctrl.editValue({ index: $index, value: value, $event: $event})"><span ng-if="$root.p3xr.settings.maxValueDisplay > 0 && value.length > $root.p3xr.settings.maxValueDisplay">{{ value.substring(0, $root.p3xr.settings.maxValueDisplay) }}...</span><span ng-if="$root.p3xr.settings.maxValueDisplay === 0 || value.length <= $root.p3xr.settings.maxValueDisplay|| $root.p3xr.settings.maxValueDisplay === -1 ">{{ value }}</span></div> <div flex="20" style="text-align:right"> <md-button class="md-icon-button md-warn" ng-click="$ctrl.deleteListElement({ index: $index, $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.delete }}</md-tooltip> <md-icon>delete</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.showJson({ value: value})"> <md-tooltip>{{ $root.p3xr.strings.intention.jsonViewShow }}</md-tooltip> <md-icon>table_chart</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.copy({ $event: $event, value: value})"> <md-tooltip>{{ $root.p3xr.strings.intention.copy }}</md-tooltip> <md-icon>content_copy</md-icon> </md-button> <md-button class="md-icon-button md-primary" ng-click="$ctrl.editValue({ index: $index, value: value, $event: $event})"> <md-tooltip>{{ $root.p3xr.strings.intention.edit }}</md-tooltip> <md-icon>edit</md-icon> </md-button> </div> </div> '},7129:e=>{e.exports='<div layout-gt-xs="row" layout="column" layout-align-gt-sm="start center" layout-align="center center" md-colors="{ background: \'primary-300\' }"> <div flex style="padding-left:3px"> {{ $root.p3xr.strings.page.key.set.table.value }} </div> <div flex="5" style="text-align:right" class="p3xr-connected-readonly-filler"> <md-button class="md-icon-button" ng-click="$ctrl.addSet({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.add }}</md-tooltip> <md-icon>add</md-icon> </md-button> </div> </div> <div layout-gt-xs="row" layout="column" layout-align-gt-sm="start start" layout-align="center center" ng-repeat="value in $ctrl.p3xrValue" ng-class="{ \'p3xr-list-key-odd-item\': $odd }" class="p3xr-list-key-item"> <div flex="95" class="p3xr-pre" style="padding-left:3px;align-items:flex-start;max-height:200px" ng-click="$ctrl.editValue({ value: value, $event: $event})"><span ng-if="$root.p3xr.settings.maxValueDisplay > 0 && value.length > $root.p3xr.settings.maxValueDisplay">{{ value.substring(0, $root.p3xr.settings.maxValueDisplay) }}...</span><span ng-if="$root.p3xr.settings.maxValueDisplay === 0 || value.length <= $root.p3xr.settings.maxValueDisplay || $root.p3xr.settings.maxValueDisplay === -1 ">{{ value }}</span></div> <div flex="5" style="text-align:right"> <md-button class="md-icon-button md-warn" ng-click="$ctrl.deleteSetMember({ value: value, $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.delete }}</md-tooltip> <md-icon>delete</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.showJson({ value: value})"> <md-tooltip>{{ $root.p3xr.strings.intention.jsonViewShow }}</md-tooltip> <md-icon>table_chart</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.copy({ $event: $event, value: value})"> <md-tooltip>{{ $root.p3xr.strings.intention.copy }}</md-tooltip> <md-icon>content_copy</md-icon> </md-button> <md-button class="md-icon-button md-primary" ng-click="$ctrl.editValue({ value: value, $event: $event})"> <md-tooltip>{{ $root.p3xr.strings.intention.edit }}</md-tooltip> <md-icon>edit</md-icon> </md-button> </div> </div> '},9263:e=>{e.exports='<div style="text-align:right"> <span ng-if="!$ctrl.editable"> <md-button class="md-button md-raised md-accent" ng-click="$ctrl.jsonViewer({ $event: $event})"> <md-icon>table_chart</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.jsonViewShow }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.jsonViewShow }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-accent" ng-click="$ctrl.copy({ $event: $event})"> <md-icon>content_copy</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.copy }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.copy }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-primary" ng-click="$ctrl.formatJson({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-icon>format_line_spacing</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.formatJson }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.formatJson }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-primary" ng-click="$ctrl.jsonEditor({ $event: $event})" ng-if="$root.p3xr.state.donated"> <i class="fas fa-file-alt"></i> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.jsonViewEditor }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.jsonViewEditor }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-primary" ng-click="$ctrl.edit()"> <md-icon>edit</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.edit }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.edit }}</md-tooltip> </md-button> </span> <span ng-if="$ctrl.editable"> <div layout="row" layout-align="end center"> <div> <md-switch ng-model="$ctrl.validateJson" class="md-accent" style="float:right" ng-if="$root.p3xr.state.connection.readonly !== true"> {{ $root.p3xr.strings.label.validateJson }} </md-switch> </div> <div> <md-button class="md-button md-raised md-warn" ng-click="$ctrl.cancelEdit()" md-autofocus> <md-icon>cancel</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.cancel }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.cancel }}</md-tooltip> </md-button> </div> <div> <md-button class="md-button md-raised md-primary" ng-click="$ctrl.save()" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-icon>save</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.save }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.save }}</md-tooltip> </md-button> </div> </div> </span> </div> <div layout-padding> <div class="p3xr-pre" style="max-width:100%;overflow:auto" ng-click="$ctrl.edit()" ng-if="!$ctrl.editable"><span ng-if="$root.p3xr.settings.maxValueDisplay > -1"><span ng-if="$root.p3xr.settings.maxValueDisplay > 0 && $ctrl.p3xrValue.length > $root.p3xr.settings.maxValueDisplay">{{ $ctrl.p3xrValue.substring(0, $root.p3xr.settings.maxValueDisplay) }}...</span><span ng-if="$root.p3xr.settings.maxValueDisplay === 0 || $ctrl.p3xrValue.length <= $root.p3xr.settings.maxValueDisplay">{{ $ctrl.p3xrValue }}</span></span></div> <div ng-if="$ctrl.editable"> <md-input-container class="md-block"> <label>{{ $root.p3xr.strings.label.edit }}</label> <textarea ng-model="$ctrl.p3xrValue"></textarea> </md-input-container> </div> </div> '},508:e=>{e.exports='<div layout-gt-xs="row" layout="column" layout-align-gt-sm="start center" layout-align="center center" md-colors="{ background: \'primary-300\' }"> <div flex="20"> <span ng-if="!$root.$mdMedia(\'xs\')">&nbsp;</span> {{ $root.p3xr.strings.page.key.zset.table.score }} </div> <div flex="60"> {{ $root.p3xr.strings.page.key.zset.table.value }} </div> <div flex="20" style="text-align:right" class="p3xr-connected-readonly-filler"> <md-button class="md-icon-button" ng-click="$ctrl.addZSet({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.add }}</md-tooltip> <md-icon>add</md-icon> </md-button> </div> </div> <div layout-gt-xs="row" layout="column" layout-align-gt-sm="start start" layout-align="center center" ng-repeat="value in $ctrl.generatedValue" ng-class="{ \'p3xr-list-key-odd-item\': $odd }" class="p3xr-list-key-item"> <div flex="20" ng-click="$ctrl.editValue({ score: value[0], member: value[1], $event: $event})"> <span ng-if="!$root.$mdMedia(\'xs\')">&nbsp;</span> {{ value[0] }} </div> <div flex="60" class="p3xr-pre" style="overflow:auto;align-items:flex-start;max-height:200px" ng-click="$ctrl.editValue({ score: value[0], member: value[1], $event: $event})"><span ng-if="$root.p3xr.settings.maxValueDisplay > 0 && value[1].length > $root.p3xr.settings.maxValueDisplay">{{ value[1].substring(0, $root.p3xr.settings.maxValueDisplay) }}...</span><span ng-if="$root.p3xr.settings.maxValueDisplay === 0 || value[1].length <= $root.p3xr.settings.maxValueDisplay|| $root.p3xr.settings.maxValueDisplay === -1 ">{{ value[1] }}</span></div> <div flex="20" style="text-align:right"> <md-button class="md-icon-button md-warn" ng-click="$ctrl.deleteZSet({ member: value[1], $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.delete }}</md-tooltip> <md-icon>delete</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.showJson({ value:  value[1]})"> <md-tooltip>{{ $root.p3xr.strings.intention.jsonViewShow }}</md-tooltip> <md-icon>table_chart</md-icon> </md-button> <md-button class="md-icon-button md-accent" ng-click="$ctrl.copy({ $event: $event, value: value[1]})"> <md-tooltip>{{ $root.p3xr.strings.intention.copy }}</md-tooltip> <md-icon>content_copy</md-icon> </md-button> <md-button class="md-icon-button md-primary" ng-click="$ctrl.editValue({ score: value[0], member: value[1], $event: $event})"> <md-tooltip>{{ $root.p3xr.strings.intention.edit }}</md-tooltip> <md-icon>edit</md-icon> </md-button> </div> </div> '},9868:e=>{e.exports=' <div style="text-align:right"> <md-button class="md-button md-raised md-warn" ng-click="$ctrl.delete({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-icon>delete</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.delete }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.delete }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-primary" ng-click="$ctrl.setTtl({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-icon>timer</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.ttl }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.ttl }} </md-tooltip> <md-tooltip ng-if="$root.$mdMedia(\'gt-sm\')">{{ $root.p3xr.strings.label.ttlTitle }}</md-tooltip> </md-button> <md-button class="md-button md-raised md-primary" ng-click="$ctrl.rename({ $event: $event})" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-icon>fingerprint</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.rename }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\') || $root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.rename }} </md-tooltip> </md-button> <md-button class="md-button md-raised md-accent" ng-click="$ctrl.refresh()"> <md-icon>refresh</md-icon> <span hide-sm hide-xs>{{ $root.p3xr.strings.intention.reloadKey }}</span> <md-tooltip ng-if="$root.$mdMedia(\'sm\')" md-direction="bottom">{{ $root.p3xr.strings.intention.reloadKey }} </md-tooltip> </md-button> </div> <md-list flex md-theme="{{ $root.p3xr.state.theme}}"> <md-divider></md-divider> <md-list-item ng-click="$ctrl.rename({ $event: $event})"> <p>{{ $root.p3xr.strings.page.key.label.key }}:&nbsp;</p> <span class="p3xr-typography-ellipsis" title="{{ $root.p3xr.ui.htmlEncode($ctrl.$stateParams.key) }}">{{ $ctrl.$stateParams.key }}</span> </md-list-item> <md-divider></md-divider> <md-list-item ng-click="$ctrl.setTtl({ $event: $event})" ng-if="$ctrl.response.ttl === -1"> <p title="{{ $root.p3xr.strings.page.key.label.ttlTitle  }}"><span class="p3xr-main-key-label-key-title">{{ $root.p3xr.strings.page.key.label.ttl }}</span>: </p> <span ng-if="$ctrl.response.ttl === -1"> {{ $root.p3xr.strings.page.key.label.ttlNotExpire }} </span> </md-list-item> <md-list-item class="md-2-line" ng-click="$ctrl.setTtl({ $event: $event})" ng-if="$ctrl.response.ttl !== -1"> <div class="md-list-item-text"> <h3> <div layout="row" flex> <div flex class="p3xr-main-key-label-key-title"> <span>{{ $root.p3xr.strings.page.key.label.ttl }}</span>: </div> <div> <span ng-if="$ctrl.response.ttl == -1"> {{ $root.p3xr.strings.page.key.label.ttlNotExpire }} </span> <span ng-if="$ctrl.response.ttl != -1"> {{ $ctrl.response.ttl }} </span> </div> </div> </h3> <p ng-click="$ctrl.setTtl({ $event: $event})" style="text-align:right"> <span style="opacity:.5;font-weight:400" ng-click="$ctrl.setTtl({ $event: $event})"> <span id="p3xr-main-key-ttl-counter"></span> </span> </p> </div> </md-list-item> <md-divider></md-divider> <md-list-item> <p>{{ $root.p3xr.strings.page.key.label.type }}:</p> {{ $root.p3xr.strings.redisTypes[$ctrl.response.type] }} </md-list-item> <md-divider></md-divider> <md-list-item> <p>{{ $root.p3xr.strings.page.key.label.encoding }}:</p> {{ $ctrl.response.encoding }} </md-list-item> <md-divider></md-divider> <md-list-item> <p>{{ $root.p3xr.strings.page.key.label.length }}:</p> <span ng-if="$ctrl.response.type === \'string\'" style="opacity:.5"> {{ $ctrl.charactersPrettyBytes($ctrl.response.length) }} &nbsp; </span> {{ $ctrl.response.length }} &nbsp; <span ng-if="$ctrl.response-type === \'string\'"> {{ $root.p3xr.strings.page.key.label.lengthString }} </span> <span ng-if="$ctrl.response.type !== \'string\'"> {{ $root.p3xr.strings.page.key.label.lengthItem }} </span> </md-list-item> </md-list> <md-divider></md-divider> <span ng-switch="" on="$ctrl.response.type"> <p3xr-main-key-string ng-switch-when="string" p3xr-response="$ctrl.response" p3xr-value="$ctrl.response.value" p3xr-key="$ctrl.$stateParams.key"></p3xr-main-key-string> <p3xr-main-key-list ng-switch-when="list" p3xr-response="$ctrl.response" p3xr-value="$ctrl.response.value" p3xr-key="$ctrl.$stateParams.key"></p3xr-main-key-list> <p3xr-main-key-hash ng-switch-when="hash" p3xr-response="$ctrl.response" p3xr-value="$ctrl.response.value" p3xr-key="$ctrl.$stateParams.key"></p3xr-main-key-hash> <p3xr-main-key-set ng-switch-when="set" p3xr-response="$ctrl.response" p3xr-value="$ctrl.response.value" p3xr-key="$ctrl.$stateParams.key"></p3xr-main-key-set> <p3xr-main-key-zset ng-switch-when="zset" p3xr-response="$ctrl.response" p3xr-value="$ctrl.response.value" p3xr-key="$ctrl.$stateParams.key"></p3xr-main-key-zset> </span> '},4498:e=>{e.exports='<md-tabs md-dynamic-height md-border-bottom> <md-tab label="{{ $root.p3xr.strings.title.db}}" ng-if="$ctrl.hasDatabases && $root.p3xr.state.connection.cluster !== true"> <md-content> <md-tabs md-dynamic-height md-border-bottom class="md-primary" id="p3xr-main-statistics-dbs"> <md-tab label="{{ key }}" ng-repeat="(key, value) in $root.p3xr.state.info.keyspaceDatabases"> <md-content> <md-list flex ng-repeat="(itemKey, itemValue) in $root.p3xr.state.info.keyspace[\'db\' + key ]"> <md-list-item> <p><strong>{{ $ctrl.generateKey(itemKey) }}</strong></p> {{ itemValue }} </md-list-item> </md-list> </md-content> </md-tab> </md-tabs> </md-content> </md-tab> <md-tab label="{{ $ctrl.generateKey(key) }}" ng-repeat="(key, value) in $root.p3xr.state.info" ng-if="key !== \'keyspace\' &&  key !== \'keyspaceDatabases\'"> <md-content ng-style="{\'maxHeight\': $ctrl.maxHeight + \'px\'}"> <md-list flex> <md-list-item ng-repeat="(itemKey, itemValue) in value"> <p><strong>{{ $ctrl.generateKey(itemKey) }}</strong></p> {{ itemValue }} </md-list-item> </md-list> </md-content> </md-tab> </md-tabs> '},3646:e=>{e.exports='<div style="float:left"> <md-button class="md-icon-button md-primary" aria-label="" ng-click="$ctrl.treeExpandAll()"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.expandAll}}</md-tooltip> <md-icon>keyboard_arrow_down</md-icon> </md-button> <md-button class="md-icon-button" aria-label="" ng-click="$ctrl.treeCollapseAll()" id="p3xr-main-treecontrol-controls-collapse-all"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.collapseAll}}</md-tooltip> <md-icon>keyboard_arrow_up</md-icon> </md-button> <span ng-click="$ctrl.noop()" id="p3xr-main-treecontrol-controls-click-noop"></span> <md-button class="md-icon-button" aria-label="" ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <md-tooltip>{{ $root.p3xr.strings.form.treeSettings.label.formName}}</md-tooltip> <md-icon>settings</md-icon> </md-button> <span> <p3xr-input id="p3xr-main-treecontrol-controls-tree-divider-input" ng-change="$ctrl.treeDividerChange()" style="width:14px;font-size:14px;text-align:center;font-family:\'Roboto Mono\'!important;font-weight:500" ng-model="$root.p3xr.settings.redisTreeDivider" ng-model-options="{debounce: 666 }"></p3xr-input> <md-tooltip>{{ $root.p3xr.strings.form.treeSettings.field.treeSeparator }}</md-tooltip> </span> <span ng-if="$root.p3xr.state.cfg.treeDividers.length > 0"> <md-select ng-model="$root.p3xr.settings.redisTreeDivider" ng-change="$ctrl.treeDividerChange()" class="p3xr-main-treecontrol-controls-divider-select md-no-underline" md-container-class="p3xr-main-treecontrol-controls-divider-select-container"> <md-option ng-repeat="divider in $root.p3xr.state.cfg.treeDividers" ng-value="divider"> {{ divider }} </md-option> </md-select> <md-tooltip>{{ $root.p3xr.strings.form.treeSettings.field.treeSeparatorSelector }}</md-tooltip> </span> </div> <span ng-if="$root.p3xr.state.pages > 1" class="p3xr-main-treecontrol-controls-pager"> <md-tooltip>{{ $root.p3xr.strings.status.keyCount({keyCount: $root.p3xr.state.keysRaw.length }) }}</md-tooltip> <md-button class="md-icon-button md-primary" aria-label="" ng-click="$ctrl.page({ page: \'first\' })"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.pager.first}}</md-tooltip> <md-icon>skip_previous</md-icon> </md-button> <md-button class="md-icon-button" aria-label="" ng-click="$ctrl.page({ page: \'prev\' })"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.pager.prev}}</md-tooltip> <md-icon>keyboard_arrow_left</md-icon> </md-button> <p3xr-input type="number" style="width:48px" step="1" min="1" ng-maxlength="$root.p3xr.state.pages" ng-change="$ctrl.pageChange()" ng-model="$root.p3xr.state.page"></p3xr-input> / {{ $root.p3xr.state.pages }} <md-button class="md-icon-button" aria-label="" ng-click="$ctrl.page({ page: \'next\' })"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.pager.next}}</md-tooltip> <md-icon>keyboard_arrow_right</md-icon> </md-button> <md-button class="md-icon-button md-primary" aria-label="" ng-click="$ctrl.page({ page: \'last\' })"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.pager.last}}</md-tooltip> <md-icon>skip_next</md-icon> </md-button> </span> <span ng-if="$root.p3xr.state.pages < 2" class="p3xr-main-treecontrol-controls-keycount"> {{ $root.p3xr.strings.status.keyCount({keyCount: $root.p3xr.state.keysRaw.length }) }}&nbsp; </span> <div class="p3xr-main-treecontrol-controls-search"> <p3xr-input placeholder="{{ $root.p3xr.settings.searchClientSide ? $root.p3xr.strings.page.treeControls.search.placeholderClient : $root.p3xr.strings.page.treeControls.search.placeholderServer }}" ng-model="$root.p3xr.state.search" ng-class="{ \'withSearch\': $root.p3xr.state.search.length > 0, \'withoutSearch\': $root.p3xr.state.search.length  === 0}" ng-enter="$ctrl.onSearchChange()"></p3xr-input> <md-tooltip md-direction="top">{{ $root.p3xr.strings.page.treeControls.search.infoDetails }}</md-tooltip> <md-button class="md-icon-button md-primary" aria-label="" ng-click="$ctrl.onSearchChange()"> <md-tooltip>{{ $root.p3xr.strings.page.treeControls.search.search}}</md-tooltip> <md-icon>search</md-icon> </md-button> <span ng-if="$root.p3xr.state.search.length > 0"> <md-button class="md-icon-button md-primary" aria-label="" ng-click="$root.p3xr.state.search = \'\'; $ctrl.onSearchChange()"><md-tooltip>{{ $root.p3xr.strings.page.treeControls.search.clear}}</md-tooltip> <md-icon>clear</md-icon> </md-button> </span> <span style="display:inline-block;position:relative;top:-2px" ng-if="$root.p3xr.state.connection.readonly !== true"> <md-tooltip>{{ $root.p3xr.strings.intention.addKeyRoot }}</md-tooltip> <md-icon ng-click="$ctrl.p3xrMainRef.addKey({event: $event})" md-theme="{{ $root.p3xr.state.themeCommon }}" class="md-warn">add</md-icon> </span> </div> '},5484:e=>{e.exports='<treecontrol ng-if="$root.keysTree.length > 0" class="{{ $ctrl.getTreeTheme() }} p3xr-main-tree" tree-model="$root.keysTree" options="$ctrl.keysTreeOptions" expanded-nodes="$root.expandedNodes" on-selection="$ctrl.selectTreeNode(node, selected, $parentNode, $index, $first, $middle, $last, $odd, $even, $path)" on-node-toggle="$ctrl.showToggle(node, expanded, $parentNode, $index, $first, $middle, $last, $odd, $even, $path)"> <span in-view="$ctrl.displayNode(node, $inview)" ng-if="!node.$inview" style="display:inline-block;width:89%;margin-left:auto;margin-right:auto;background-color:rgba(128,128,128,.5);height:2px;margin-bottom:10px;margin-top:10px"></span> <span ng-if="node.$inview" data-p3xr-tree-key="{{$ctrl.extractNodeKey(node)}}"> <md-tooltip md-direction="top">{{ $ctrl.extractNodeTooltip(node) }}</md-tooltip> <label class="p3xr-main-tree-node" ng-mouseover="$ctrl.treeHover({node})" ng-mouseleave="node.show = false"> <span ng-switch="node.keysInfo.type"> <i ng-switch-when="hash" class="p3xr-main-treecontrol-node-icon fas fa-hashtag" aria-hidden="true"></i> <i ng-switch-when="list" class="p3xr-main-treecontrol-node-icon fas fa-list-ol" aria-hidden="true"></i> <i ng-switch-when="set" class="p3xr-main-treecontrol-node-icon fas fa-list" aria-hidden="true"></i> <i ng-switch-when="string" class="p3xr-main-treecontrol-node-icon fas fa-ellipsis-h" aria-hidden="true"></i> <i ng-switch-when="zset" class="p3xr-main-treecontrol-node-icon fas fa-chart-line" aria-hidden="true"></i> </span> {{node.label}} <span class="p3xr-main-tree-node-count" ng-if="node.type === \'folder\'">{{$root.p3xr.settings.redisTreeDivider}}* ({{node.childCount}})</span> <span class="p3xr-main-tree-node-count" ng-if="node.type !== \'folder\' && node.keysInfo.type !== \'string\' && node.keysInfo !== undefined">({{node.keysInfo.length}})</span> <span ng-if="node.type === \'folder\'" ng-show="node.show" style="position:relative;top:-1px"> <span> <md-tooltip md-direction="right">{{ $root.p3xr.strings.confirm.deleteAllKeys({key: node.key}) }}</md-tooltip> <md-icon ng-click="$ctrl.deleteTree({event: $event, node: node})" class="md-warn p3xr-main-treecontrol-folder-icon">close</md-icon> </span> <span style="position:relative;top:-1px"> <md-tooltip md-direction="right">{{ $root.p3xr.strings.intention.addKey }}</md-tooltip> <md-icon ng-click="$ctrl.addKey({event: $event, node: node})" md-theme="{{ $root.p3xr.state.themeCommon }}" class="md-warn p3xr-main-treecontrol-folder-icon">add</md-icon> </span> </span> </label> </span> </treecontrol> '},8236:e=>{e.exports=' <div> <md-toolbar class="md-primary md-hue-1" md-theme="{{ $root.p3xr.state.themeLayout}}" id="p3xr-console-header"> <div class="md-toolbar-tools"> <h2 flex md-truncate>{{ $root.p3xr.strings.label.console }}</h2> <span> <md-tooltip ng-if="$root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.intention.pubsubMonitor }}</md-tooltip> <md-checkbox ng-model="$root.p3xr.state.monitor" style="transform:scale(.75)" id="p3xr-console-pubsub-checkbox"> <span hide-xs>{{ $root.p3xr.strings.intention.pubsubMonitor }}</span> </md-checkbox> </span> <p3xr-button p3xr-label="$root.p3xr.strings.intention.commands" p3xr-md-icon="menu" ng-click="$ctrl.commands({ $event: $event})"></p3xr-button> <p3xr-button p3xr-label="$root.p3xr.strings.intention.clear" p3xr-md-icon="clear" ng-click="$ctrl.clearConsole()"></p3xr-button> </div> </md-toolbar> <md-content md-theme="{{ $root.p3xr.state.theme}}" layout-padding id="p3xr-console-content" md-whiteframe="1" class="p3xr-content-border"> <div id="p3xr-console-content-output"> </div> <p3xr-input id="p3xr-console-input" ng-keydown="$ctrl.action($event)" ng-model="$ctrl.inputValue"></p3xr-input> </md-content> </div> '},4007:e=>{e.exports='<md-toolbar class="md-accent" md-theme="{{ $root.p3xr.state.themeLayout}}"> <div class="md-toolbar-tools"> <h2 flex md-truncate>{{ $root.p3xr.strings.title.socketioConnectError }}</h2> </div> </md-toolbar> <md-content md-theme="{{ $root.p3xr.state.theme}}" layout-padding> <p3xr-button ng-click="$root.locationReload()" p3xr-label="$root.p3xr.strings.intention.reload" p3xr-fa-icon="fas fa-redo"></p3xr-button> <br/> <br/> {{ $ctrl.$stateParams.error.message }} </md-content> '},1856:e=>{e.exports='<div class="p3xr-content-border"> <md-toolbar class="md-primary md-hue-1" md-theme="{{ $root.p3xr.state.themeLayout}}" id="p3xr-main-header"> <div class="md-toolbar-tools"> <h2 flex md-truncate hide-xs> <a ui-sref="main.statistics"> {{ $root.p3xr.strings.intention.main }} </a> </h2> <span ng-if="$root.p3xr.state.connection !== undefined"> <button class="md-button" style="cursor:inherit!important;margin:0;padding:0" ng-if="$root.p3xr.state.connection.cluster !== true"> <span ng-if="!$root.$mdMedia(\'xs\')" style="position:relative;top:1px">{{ $root.p3xr.strings.form.main.label.database.toUpperCase() }}:</span> <md-input-container> <md-tooltip ng-if="$root.$mdMedia(\'xs\')" md-direction="bottom">{{ $root.p3xr.strings.form.main.label.database }}</md-tooltip> <md-select ng-model="$ctrl.currentDatabase" aria-label="{{ $root.p3xr.strings.form.main.label.database }}" class="md-accent p3xr-main-db-select" md-container-class="p3xr-main-db-select-container"> <md-option ng-repeat="dbIndex in $root.p3xr.state.databaseIndexes" ng-value="dbIndex" ng-click="$ctrl.selectDatabase(dbIndex)"> <span ng-if="$root.p3xr.state.info.keyspaceDatabases[dbIndex]"> <md-icon>radio_button_checked</md-icon> </span> <span ng-if="!$root.p3xr.state.info.keyspaceDatabases[dbIndex]"> <md-icon>radio_button_unchecked</md-icon> </span> {{ dbIndex }} </md-option> </md-select> </md-input-container> </button> <p3xr-button class="p3xr-main-toolbar-button p3xr-main-toolbar-button-hide-on-small" ng-if="$root.p3xr.state.connection.awsElastiCache !== true && $root.p3xr.state.connection.readonly !== true" ng-click="$ctrl.save()" p3xr-label="$root.p3xr.strings.intention.save" p3xr-md-icon="save"></p3xr-button> <p3xr-button class="p3xr-main-toolbar-button" ng-click="$ctrl.statistics()" p3xr-label="$root.p3xr.strings.intention.statistics" p3xr-md-icon="show_chart"></p3xr-button> <p3xr-button class="p3xr-main-toolbar-button" ng-click="$ctrl.refresh()" p3xr-label="$root.p3xr.strings.intention.refresh" p3xr-md-icon="refresh"></p3xr-button> </span> </div> </md-toolbar> <md-content md-theme="{{ $root.p3xr.state.theme}}" id="p3xr-main-content" md-whiteframe="2"> <div class="md-title" layout-padding ng-if="$root.p3xr.state.connections.list.length > 0 && $root.p3xr.state.connection === undefined"> {{ $root.p3xr.strings.title.main }} </div> <div ng-if="$root.p3xr.state.connections.list.length === 0 && $root.p3xr.state.connection === undefined" layout-padding><md-button ui-sref="settings" md-no-ink style="display:inline-block;word-wrap:break-word;white-space:normal">{{ $root.p3xr.strings.intention.noConnections }}</md-button></div> <div ng-if="$root.p3xr.state.connection !== undefined"> <div ng-if="!$root.$mdMedia(\'xs\')"> <p3xr-main-treecontrol-controls id="p3xr-main-treecontrol-controls-container" p3xr-main-ref="$ctrl"></p3xr-main-treecontrol-controls> <p3xr-main-tree id="p3xr-main-treecontrol-container" p3xr-resize="$ctrl.resize()" p3xr-main-ref="$ctrl"></p3xr-main-tree> <div id="p3xr-main-content-sizer" md-colors="{ background: resizerColor }" md-theme="{{ $root.p3xr.state.themeLayout}}"> </div> <div id="p3xr-main-content-container"> <ui-view> </ui-view> </div> </div> <div layout="column" ng-if="$root.$mdMedia(\'xs\')"> <p3xr-main-treecontrol-controls p3xr-main-ref="$ctrl" flex></p3xr-main-treecontrol-controls> <p3xr-main-tree flex id="p3xr-main-treecontrol-container-directive-small" p3xr-resize="$ctrl.resize()" p3xr-main-ref="$ctrl"></p3xr-main-tree> <ui-view flex> </ui-view> </div> </div> </md-content></div> '},2305:e=>{e.exports=' <p3xr-accordion p3xr-title="$root.p3xr.strings.label.connections" p3xr-accordion-key="settings"> <p3xr-accordion-actions ng-if="!$root.p3xr.state.cfg.readonlyConnections"> <p3xr-button ng-click="$ctrl.connectionForm({ type: \'new\', $event: $event})" p3xr-label="$root.p3xr.strings.intention.connectionAdd" p3xr-md-icon="add_box"></p3xr-button> </p3xr-accordion-actions> <p3xr-accordion-content> <div ng-if="$root.p3xr.state.connections.list.length == 0" layout-padding> {{ $root.p3xr.strings.intention.noConnectionsInSettings }} </div> <md-list ng-if="$root.p3xr.state.connections.list.length > 0"> <md-list-item class="md-2-line" ng-repeat="connection in $root.p3xr.state.connections.list"> <div class="md-list-item-text"> <h3>{{connection.name}}</h3> <p>{{connection.host}}:{{connection.port}}</p> </div> <md-button class="md-warn md-raised" ng-click="$ctrl.deleteConnection({ model: connection, ev: $event})" ng-if="!$root.p3xr.state.cfg.readonlyConnections"> <md-icon>delete_forever</md-icon> <span hide-xs>{{ $root.p3xr.strings.intention.delete }}</span> <md-tooltip ng-if="$root.$mdMedia(\'xs\')">{{ $root.p3xr.strings.intention.delete }}</md-tooltip> </md-button> <md-button class="md-primary md-raised" ng-click="$ctrl.connectionForm({ type: \'edit\', model: connection, $event: $event})" ng-if="!$root.p3xr.state.cfg.readonlyConnections"> <md-icon>edit</md-icon> <span hide-xs>{{ $root.p3xr.strings.intention.edit }}</span> <md-tooltip ng-if="$root.$mdMedia(\'xs\')">{{ $root.p3xr.strings.intention.edit }}</md-tooltip> </md-button> <md-button class="md-primary md-raised" ng-click="$ctrl.connectionForm({ type: \'edit\', model: connection})" ng-if="$root.p3xr.state.cfg.readonlyConnections"> <md-icon>mode_comment</md-icon> <span hide-xs>{{ $root.p3xr.strings.intention.view }}</span> <md-tooltip ng-if="$root.$mdMedia(\'xs\')">{{ $root.p3xr.strings.intention.view }}</md-tooltip> </md-button> <md-divider ng-if="!$last"></md-divider> </md-list-item> </md-list> </p3xr-accordion-content> </p3xr-accordion> <br/> <p3xr-accordion p3xr-title="$root.p3xr.strings.form.treeSettings.label.formName" p3xr-accordion-key="tree-settings"> <p3xr-accordion-actions> <p3xr-button ng-click="$ctrl.openTreeSettingDialog({ $event: $event})" p3xr-label="$root.p3xr.strings.intention.edit" p3xr-md-icon="edit"></p3xr-button> </p3xr-accordion-actions> <p3xr-accordion-content> <md-list> <md-list-item ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div layout="row" flex> <div flex> {{ $root.p3xr.strings.form.treeSettings.field.treeSeparator}} </div> <div> <span ng-if="$root.p3xr.settings.redisTreeDivider.length > 0"> {{ $root.p3xr.settings.redisTreeDivider}} </span> <span ng-if="$root.p3xr.settings.redisTreeDivider.length < 1 || $root.p3xr.settings.redisTreeDivider === undefined || $root.p3xr.settings.redisTreeDivider === \'\'"> {{ $root.p3xr.strings.label.treeSeparatorEmptyNote}} </span> </div> </div> </md-list-item> <md-divider></md-divider> <md-list-item ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div layout="row" flex> <div flex> {{ $root.p3xr.strings.form.treeSettings.field.page}} </div> <div> {{ $root.p3xr.settings.pageCount}} </div> </div> </md-list-item> <md-divider></md-divider> <md-list-item class="md-2-line" ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div class="md-list-item-text"> <h3> <div layout="row" flex> <div flex> {{ $root.p3xr.strings.form.treeSettings.maxValueDisplay}} </div> <div> {{ $root.p3xr.settings.maxValueDisplay}} </div> </div> </h3> <p> {{ $root.p3xr.strings.form.treeSettings.maxValueDisplayInfo }} </p> </div> </md-list-item> <md-divider></md-divider> <md-list-item class="md-2-line" ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div class="md-list-item-text"> <h3> <div layout="row" flex> <div flex> {{ $root.p3xr.strings.form.treeSettings.maxKeys}} </div> <div> {{ $root.p3xr.settings.maxKeys}} </div> </div> </h3> <p> {{ $root.p3xr.strings.form.treeSettings.maxKeysInfo }} </p> </div> </md-list-item> <md-divider></md-divider> <md-list-item ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div layout="row" flex> <div flex> {{ $root.p3xr.strings.form.treeSettings.field.keysSort}} </div> <div> {{ $root.p3xr.settings.keysSort ? $root.p3xr.strings.label.keysSort.on : $root.p3xr.strings.label.keysSort.off }} </div> </div> </md-list-item> <md-divider></md-divider> <md-list-item ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div layout="row" flex> <div flex> {{ $root.p3xr.strings.form.treeSettings.field.searchMode}} </div> <div> {{ $root.p3xr.settings.searchClientSide ? $root.p3xr.strings.form.treeSettings.label.searchModeClient : $root.p3xr.strings.form.treeSettings.label.searchModeServer }} </div> </div> </md-list-item> <md-divider></md-divider> <md-list-item ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div layout="row" flex> <div flex> {{ $root.p3xr.strings.form.treeSettings.field.searchModeStartsWith}} </div> <div> {{ $root.p3xr.settings.searchStartsWith ? $root.p3xr.strings.form.treeSettings.label.searchModeStartsWith : $root.p3xr.strings.form.treeSettings.label.searchModeIncludes }} </div> </div> </md-list-item> <md-divider></md-divider> <md-list-item ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div layout="row" flex> <div flex> {{ $root.p3xr.settings.jsonFormat == 2 ? $root.p3xr.strings.form.treeSettings.label.jsonFormatTwoSpace : $root.p3xr.strings.form.treeSettings.label.jsonFormatFourSpace }} </div> </div> </md-list-item> <md-divider></md-divider> <md-list-item ng-click="$ctrl.openTreeSettingDialog({ $event: $event})"> <div layout="row" flex> <div flex> {{ $root.p3xr.settings.animation ? $root.p3xr.strings.form.treeSettings.label.animation : $root.p3xr.strings.form.treeSettings.label.noAnimation }} </div> </div> </md-list-item> </md-list> </p3xr-accordion-content> </p3xr-accordion> <div class="p3xr-settings-bottom"></div> '},2862:e=>{e.exports=' <div> <md-toolbar class="md-primary md-hue-1" md-theme="{{ $root.p3xr.state.themeLayout}}" md-whiteframe="{{ $ctrl.extended ? -1 : 1 }}"> <div class="md-toolbar-tools"> <h2 flex md-truncate ng-click="$ctrl.extended = !$ctrl.extended">{{ $ctrl.p3xrTitle }}</h2> <span ng-if="$ctrl.transcludePresent(\'actions\')" ng-transclude="actions"></span> <md-button class="md-icon-button" ng-click="$ctrl.extended = !$ctrl.extended"> <md-icon>{{ !$ctrl.extended ? \'keyboard_arrow_down\' : \'keyboard_arrow_up\' }}</md-icon> <md-tooltip>{{ !$ctrl.extended ? $root.p3xr.strings.intention.extend : $root.p3xr.strings.intention.collapse}} </md-tooltip> </md-button> </div> </md-toolbar> <md-content ng-if="$ctrl.extended" md-theme="{{ $root.p3xr.state.theme}}" ng-transclude="content" md-whiteframe="2" class="p3xr-content-border"> </md-content> </div> '},9670:e=>{e.exports='<md-button class="{{ $ctrl.p3xrClasses }}"> <md-icon ng-if="$ctrl.p3xrMdIcon !== undefined">{{ $ctrl.p3xrMdIcon }}</md-icon> <i ng-if="$ctrl.p3xrFaIcon !== undefined" class="{{ $ctrl.p3xrFaIcon }}"></i> <span ng-if="$root.$mdMedia(\'(min-width: 699px)\')">{{ $ctrl.p3xrLabel }}</span> <md-tooltip ng-if="$root.$mdMedia(\'(max-width: 699px)\')" md-direction="{{ $ctrl.p3xrTooltipDirection || \'bottom\' }}">{{ $ctrl.p3xrLabel }} </md-tooltip> </md-button> '},8565:(e,t,n)=>{"use strict";n.r(t)},7356:(e,t,n)=>{let o;e.exports=()=>{n.g.p3xr.destroy(),void 0===o?o=document.body.innerHTML:document.body.innerHTML=o;const e=()=>{angular.element(document).ready((()=>{const e=document.getElementById("p3xr-redis-ui-bootstrap");angular.bootstrap(e,["p3xr-redis-ui"])}))};if(document.hasFocus()||/electron/i.test(navigator.userAgent))e();else{const t=()=>{e(),window.removeEventListener("focus",t)};window.addEventListener("focus",t)}}},6996:(e,t,n)=>{p3xr.ng=angular.module("p3xr-redis-ui",["ngCookies","ngAnimate","ngAria","ngSanitize","ngMessages","ngMaterial","ui.router","treeControl","angular-json-tree","angular-inview"]),n(8136),p3xr.ng.config(["$qProvider","$locationProvider","$urlRouterProvider","$stateProvider","p3xrThemeProvider","$mdAriaProvider",(e,t,o,r,i,s)=>{s.disableWarnings(),e.errorOnUnhandledRejections(!1),t.html5Mode(!0),i.start();const a=n(3597);o.otherwise("/main"),a(r)}]),p3xr.ng.run(["$rootScope","p3xrSocket","p3xrTheme","$mdMedia","$state","$timeout","$cookies","p3xrRedisParser","$animate",(e,t,n,o,r,i,s,a,d)=>{let l,c,m;e.p3xr=p3xr,e.$mdMedia=o,e.isElectron=/electron/i.test(navigator.userAgent),e.hasConnected=()=>0!==Object.keys(p3xr.state.redisConnections).length,e.locationReload=()=>{location.href="/"},Object.defineProperty(e.p3xr.state,"search",{get:()=>(l=s.get("p3xr-state-search"),void 0===l&&(l=""),l),set:e=>{l=e,l=s.put("p3xr-state-search",e,{expires:p3xr.settings.cookieExpiry})}}),Object.defineProperty(e.p3xr.settings,"redisTreeDivider",{get:()=>(c=s.get(p3xr.settings.tree.cookieName),void 0===c&&(c=p3xr.settings.tree.defaultDivider),c),set:e=>{c=e,c=s.put(p3xr.settings.tree.cookieName,e,{expires:p3xr.settings.cookieExpiry})}}),Object.defineProperty(e.p3xr.settings,"jsonFormat",{get:()=>(m=s.get(p3xr.settings.jsonFormatSettings.cookieName),void 0===m&&(m=p3xr.settings.jsonFormatSettings.default),parseInt(m)),set:e=>{m=e,m=s.put(p3xr.settings.jsonFormatSettings.cookieName,e,{expires:p3xr.settings.cookieExpiry})}});const p=()=>{console.log("set animation",e.p3xr.settings.animation),d.enabled(e.p3xr.settings.animation),e.p3xr.settings.animation?$body.removeClass("p3xr-no-animation"):$body.addClass("p3xr-no-animation")};let u,g,x,h,f,y,v;Object.defineProperty(e.p3xr.settings,"animation",{get:()=>(u=s.get(p3xr.settings.animationSettings.cookieName),void 0===u&&(u=p3xr.settings.animationSettings.default),1===parseInt(u)),set:e=>{u=e,u=s.put(p3xr.settings.animationSettings.cookieName,e,{expires:p3xr.settings.cookieExpiry}),p()}}),p(),Object.defineProperty(e.p3xr.settings,"maxValueDisplay",{get:()=>(g=s.get(p3xr.settings.maxValueDisplaySetting.cookieName),void 0===g&&(g=p3xr.settings.maxValueDisplaySetting.default),parseInt(g)),set:e=>{g=parseInt(e),g=s.put(p3xr.settings.maxValueDisplaySetting.cookieName,e,{expires:p3xr.settings.cookieExpiry})}}),Object.defineProperty(e.p3xr.settings,"maxKeys",{get:()=>{x=s.get(p3xr.settings.maxKeysSettings.cookieName),void 0===x&&(x=p3xr.settings.maxKeysSettings.default);let e=parseInt(x);return(isNaN(e)||e<5||e>p3xr.settings.maxKeysSettings.max)&&(e=p3xr.settings.maxKeysSettings.default),e},set:e=>{x=parseInt(e),x=s.put(p3xr.settings.maxKeysSettings.cookieName,e,{expires:p3xr.settings.cookieExpiry})}}),Object.defineProperty(e.p3xr.settings.language,"current",{get:()=>(h=s.get(p3xr.settings.language.cookieName),void 0===h&&(h=p3xr.settings.language.defaultLanguage),h),set:t=>{void 0===t&&(t=p3xr.settings.language.defaultLanguage),h=t,e.p3xr.strings=p3xr.settings.language.translation[t],h=s.put(p3xr.settings.language.cookieName,t,{expires:p3xr.settings.cookieExpiry})}}),e.p3xr.settings.language.current=s.get(p3xr.settings.language.cookieName),Object.defineProperty(e.p3xr.settings,"keysSort",{get:()=>(f=s.get(p3xr.settings.keySortInfo.cookieName),void 0===f?f=p3xr.settings.keySortInfo.default:"true"===f?f=!0:"false"===f&&(f=!1),f),set:e=>{f=e,f=s.put(p3xr.settings.keySortInfo.cookieName,e,{expires:p3xr.settings.cookieExpiry})}}),Object.defineProperty(e.p3xr.settings,"searchClientSide",{get:()=>(y=s.get(p3xr.settings.searchInfoClientSide.cookieName),void 0===y?y=p3xr.settings.searchInfoClientSide.default:"true"===y?y=!0:"false"===y&&(y=!1),(p3xr.state.keysRaw.length>p3xr.settings.maxLightKeysCount||p3xr.state.dbsize>p3xr.settings.maxLightKeysCount)&&(y=!1),y),set:e=>{y=e,y=s.put(p3xr.settings.searchInfoClientSide.cookieName,e,{expires:p3xr.settings.cookieExpiry})}}),Object.defineProperty(e.p3xr.settings,"searchStartsWith",{get:()=>(v=s.get(p3xr.settings.searchInfoStartsWith.cookieName),void 0===v?v=p3xr.settings.searchInfoStartsWith.default:"true"===v?v=!0:"false"===v&&(v=!1),v),set:e=>{v=e,v=s.put(p3xr.settings.searchInfoStartsWith.cookieName,e,{expires:p3xr.settings.cookieExpiry})}});let b=[];Object.defineProperty(e,"expandedNodes",{get:()=>b,set:e=>{b=e}}),e.savedExpandedNodes=[];let $,k=1;Object.defineProperty(e.p3xr.state,"page",{get:()=>k,set:e=>{k=parseInt(e)}}),e.keysTreeRendered=[],Object.defineProperty(e,"keysTree",{get:()=>(!0!==e.p3xr.state.redisChanged&&JSON.stringify($)===JSON.stringify(p3xr.state.keys)||(e.p3xr.state.redisChanged=!1,e.keysTreeRendered=a.keysToTreeControl({keys:p3xr.state.keys}),$=p3xr.state.keys),e.keysTreeRendered)});let w,C=[];Object.defineProperty(e.p3xr.state,"keys",{get:()=>{if(C=e.p3xr.state.keysRaw.slice(),e.p3xr.settings.searchClientSide&&"string"==typeof e.p3xr.state.search&&e.p3xr.state.search.length>0&&(C=e.p3xr.settings.searchStartsWith?C.filter((t=>t.startsWith(e.p3xr.state.search))):C.filter((t=>t.includes(e.p3xr.state.search)))),C<=e.p3xr.settings.pageCount)return C;{const t=(e.p3xr.state.page-1)*e.p3xr.settings.pageCount;return C.slice(t,t+e.p3xr.settings.pageCount)}}}),Object.defineProperty(e.p3xr.state,"pages",{get:()=>Math.ceil(C.length/e.p3xr.settings.pageCount)}),Object.defineProperty(e.p3xr.settings,"pageCount",{get:()=>(w=s.get(p3xr.settings.paging.cookieName),w=void 0===w?p3xr.settings.paging.default:parseInt(w),w),set:e=>{w=e,w=s.put(p3xr.settings.paging.cookieName,e,{expires:p3xr.settings.cookieExpiry})}}),n.start(),console.info("P3X Redis UI ran")}]),n(7356)()},5548:(e,t,n)=>{p3xr.ng.factory("p3xrDialogConnection",["p3xrCommon","$mdDialog","p3xrSocket",function(e,t,o){return new function(){this.show=async r=>{try{await t.show({controller:["$scope","$mdDialog",function(t,n){t.options=r,void 0!==r.model?(t.model=r.model,t.model.password=r.model.id):t.model={awsElastiCache:!1,azure:!1,name:void 0,host:void 0,port:void 0,password:void 0,id:void 0,readonly:void 0},t.model.hasOwnProperty("cluster")||(t.model.cluster=!1),t.model.hasOwnProperty("nodes")||(t.model.nodes=[]);for(let e of t.model.nodes)e.password=e.id;t.cancel=function(){n.cancel()};const i=()=>!t.p3xrConnectionForm.$invalid||(e.toast({message:p3xr.strings.form.error.invalid}),!1);t.addNode=e=>{const n={host:void 0,port:void 0,password:void 0,id:p3xr.nextId()};void 0===e?t.model.nodes.push(n):t.model.nodes.splice(e+1,0,n)},t.removeNode=async(n,o)=>{try{await e.confirm({event:n,message:p3xr.strings.confirm.deleteConnectionText}),t.model.nodes.splice(o,1),e.toast({message:p3xr.strings.status.nodeRemoved})}catch(t){if(void 0===t)return;e.generalHandleError(t)}},t.testConnection=async()=>{if(t.p3xrConnectionForm.$setSubmitted(),i())try{p3xr.ui.overlay.show({message:p3xr.strings.title.connectingRedis});await o.request({action:"redis-test-connection",payload:{model:t.model}});e.toast({message:p3xr.strings.status.redisConnected})}catch(t){e.generalHandleError(t)}finally{p3xr.ui.overlay.hide()}},t.submit=async()=>{if(i()){void 0===t.model.host&&(t.model.host="localhost"),void 0===t.model.port&&(t.model.port=6379),"new"===r.type&&(t.model.id=p3xr.nextId());for(let e of t.model.nodes)void 0===e.host&&(e.host="localhost"),void 0===e.id&&(e.id=p3xr.nextId());try{await o.request({action:"connection-save",payload:{model:angular.copy(t.model)}});e.toast({message:"new"===t.options.type?p3xr.strings.status.added:p3xr.strings.status.saved}),n.cancel()}catch(t){e.generalHandleError(t)}}}}],template:n(9862),parent:angular.element(document.body),targetEvent:r.$event,clickOutsideToClose:!0,fullscreen:!0})}catch(t){e.generalHandleError(t)}}}}])},4762:(e,t,n)=>{p3xr.ng.factory("p3xrDialogJsonEditor",["p3xrCommon","$mdDialog","$timeout",function(e,t,o){return new function(){this.show=async e=>(await Promise.all([n.e(139),n.e(524)]).then(n.t.bind(n,9524,23)),t.show({controller:["$scope","$mdDialog","p3xrCommon","$rootScope","p3xrTheme",function(t,r,i,s,a){let d,l;s.$broadcast("p3xr-main-resizer",{drag:!1});try{l=JSON.parse(e.value),t.isJson=!0}catch(e){l=void 0,t.isJson=!1}if(t.isJson){(async()=>{try{o((()=>{let e;switch(p3xr.settings.language.current){case"zn":e="zh-CN";break;default:e="en"}const t=document.getElementById("p3xr-jsoneditor"),n={limitDragging:!1,modes:["tree","code","view","preview"],mode:"code",language:e,indentation:p3xr.settings.jsonFormat};a.isDark()&&(n.theme="ace/theme/twilight"),d=new JSONEditor(t,n,l)}))}catch(e){i.generalHandleError(e)}})()}const c=e=>{if(27===(e.which||e.keyCode)){e.preventDefault(),e.stopPropagation();const t=$(".pico-close");t.length>0?t.click():r.cancel()}};document.documentElement.addEventListener("keydown",c,!0);const m=n(7280)((()=>{d&&d.aceEditor&&(console.log("resize json editor ace resize"),d.aceEditor.resize())}),p3xr.settings.debounce);$window.on("resize",m),t.$on("$destroy",(()=>{$window.off("resize",m),d&&(d.destroy(),d=void 0),s.$broadcast("p3xr-main-resizer",{drag:!0}),document.documentElement.removeEventListener("keydown",c,!0)})),t.ok=function(){r.cancel()},t.save=function({format:e}){try{r.hide({obj:JSON.stringify(d.get(),null,e?p3xr.settings.jsonFormat:0)})}catch(e){i.generalHandleError(e)}}}],template:n(8133),parent:angular.element(document.body),targetEvent:e.$event,clickOutsideToClose:!1,fullscreen:!0,multiple:!0,escapeToClose:!1}))}}])},66:(e,t,n)=>{p3xr.ng.factory("p3xrDialogJsonView",["p3xrCommon","$mdDialog",function(e,t){return new function(){this.show=async o=>{try{await t.show({controller:["$scope","$mdDialog","$timeout",function(e,t,n){e.treeExpandAll=()=>{p3xr.ui.overlay.show({message:p3xr.strings.title.jsonRecursive}),n((()=>{e.howExpanded="recursive",n((()=>{p3xr.ui.overlay.hide()}))}))},e.treeCollapseAll=()=>{e.howExpanded=!0};try{e.howExpanded=!0,e.obj=JSON.parse(o.value),e.isJson=!0}catch(t){e.obj=void 0,e.isJson=!1}e.ok=function(){t.cancel()}}],template:n(3857),parent:angular.element(document.body),targetEvent:o.$event,clickOutsideToClose:!0,fullscreen:!0,multiple:!0})}catch(t){e.generalHandleError(t)}}}}])},933:(e,t,n)=>{p3xr.ng.factory("p3xrDialogKeyNewOrSet",["p3xrCommon","$mdDialog","p3xrSocket","p3xrDialogJsonEditor","p3xrDialogJsonView",function(e,t,o,r,i){return new function(){this.show=s=>new Promise((async(a,d)=>{try{await t.show({controller:["$scope","$mdDialog",function(t,l){t.jsonViewer=e=>{i.show({event:e.$event,value:e.value})},t.copy=t=>{n.g.p3xr.clipboard({value:t.value}),e.toast(p3xr.strings.status.dataCopied)},t.types=["string","list","hash","set","zset"],t.validateJson=!1,t.model={type:"string",key:void 0!==s.node?s.node.key:"",value:void 0,score:void 0,hashKey:void 0,index:void 0},t.options=s,s.hasOwnProperty("model")&&Object.assign(t.model,s.model),t.cancel=function(){l.cancel(),d()};t.submit=async()=>{if(!t.p3xrKeyNewForm.$invalid||(e.toast({message:p3xr.strings.form.error.invalid}),0))try{const n=await o.request({action:"key-new-or-set",payload:{type:s.type,originalValue:s.hasOwnProperty("model")?s.model.value:void 0,originalHashKey:s.hasOwnProperty("model")?s.model.hashKey:void 0,model:angular.copy(t.model)}});window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/key-new-or-set"}),a(n),e.toast({message:p3xr.strings.status.set}),l.cancel()}catch(t){e.generalHandleError(t)}},t.jsonEditor=async n=>{try{const e=await r.show({event:n.$event,value:n.value});t.model.value=e.obj,t.$digest()}catch(t){e.generalHandleError(t)}},t.formatJson=()=>{try{t.model.value=JSON.stringify(JSON.parse(t.model.value),null,p3xr.settings.jsonFormat)}catch(t){e.toast({message:p3xr.strings.label.jsonViewNotParsable})}}}],template:n(5817),parent:angular.element(document.body),targetEvent:s.$event,clickOutsideToClose:!1,fullscreen:!0,multiple:!0})}catch(t){d(t),e.generalHandleError(t)}}))}}])},7753:(e,t,n)=>{p3xr.ng.factory("p3xrDialogTreecontrolSettings",["p3xrCommon","$mdDialog","$timeout",function(e,t,o){return new function(){this.show=async o=>{try{await t.show({controller:["$scope","$rootScope",function(n,r){console.log("$rootScope.p3xr.settings.maxValueDisplay",r.p3xr.settings.maxValueDisplay),n.model={treeSeparator:r.p3xr.settings.redisTreeDivider,pageCount:r.p3xr.settings.pageCount,keysSort:r.p3xr.settings.keysSort,searchClientSide:r.p3xr.settings.searchClientSide,searchStartsWith:r.p3xr.settings.searchStartsWith,maxValueDisplay:r.p3xr.settings.maxValueDisplay,maxKeys:r.p3xr.settings.maxKeys,jsonFormat:2===r.p3xr.settings.jsonFormat,animation:r.p3xr.settings.animation},n.cancel=function(){t.cancel()};n.submit=async()=>{if(!n.p3xrDialogTreecontrolSettingsForm.$invalid||(e.toast({message:p3xr.strings.form.error.invalid}),0))try{r.p3xr.settings.redisTreeDivider=n.model.treeSeparator,r.p3xr.settings.pageCount=n.model.pageCount,r.p3xr.settings.keysSort=n.model.keysSort,r.p3xr.settings.searchClientSide=n.model.searchClientSide,r.p3xr.settings.searchStartsWith=n.model.searchStartsWith,r.p3xr.state.page=1,r.p3xr.state.redisChanged=!0,r.p3xr.settings.maxValueDisplay=n.model.maxValueDisplay,r.p3xr.settings.maxKeys=n.model.maxKeys,r.p3xr.settings.jsonFormat=!0===n.model.jsonFormat?2:4,r.p3xr.settings.animation=!0===n.model.animation?1:0,void 0!==o.p3xrMainRef&&o.p3xrMainRef.refresh(),t.cancel(),r.$broadcast("p3x-refresh")}catch(t){e.generalHandleError(t)}}}],template:n(526),parent:angular.element(document.body),targetEvent:o.$event,clickOutsideToClose:!0,fullscreen:!0})}catch(t){e.generalHandleError(t)}}}}])},6051:(e,t,n)=>{p3xr.ng.factory("p3xrDialogTtl",["p3xrCommon","$mdDialog",function(e,t){const o=n(7284);return new function(){this.show=async r=>{try{return await t.show({controller:["$scope","$mdDialog",function(t,i){t.cancel=function(){i.cancel()},t.model=r.model;const s=n(4848);"number"==typeof t.model.ttl&&t.model.ttl>0?t.convertTextToTime=s(1e3*t.model.ttl,{delimiter:" "}):t.convertTextToTime="",t.openTimestringNpm=()=>{window.open("https://www.npmjs.com/package/timestring#keywords","_blank")};let a=!0;t.$watch("convertTextToTime",((e,n)=>{if(a)a=!a;else try{t.model.ttl=o(String(e),"s")}catch(e){console.warn("timestring parse error",e)}}));t.submit=async()=>{if(!t.p3xrTtlForm.$invalid||(e.toast({message:p3xr.strings.form.error.invalid}),0))try{isNaN(t.model.ttl)&&(t.model.ttl=Math.round(t.model.ttl));const e={model:t.model};i.hide(e)}catch(t){e.generalHandleError(t)}}}],template:n(5006),parent:angular.element(document.body),targetEvent:r.$event,clickOutsideToClose:!0})}catch(t){e.generalHandleError(t)}}}}])},6474:()=>{p3xr.ng.directive("p3xValidateJson",(function(){return{restrict:"A",require:"ngModel",scope:{p3xValidateJsonRequired:"<"},link:function(e,t,n,o){let r,i=e.p3xValidateJsonRequired||!1;e.$watch("p3xValidateJsonRequired",((e,t)=>{if(i=e,i)try{JSON.parse(r),o.$setValidity("p3xValidateJson",!0)}catch(e){o.$setValidity("p3xValidateJson",!1)}else o.$setValidity("p3xValidateJson",!0)})),o.$validators.p3xIsJson=(e,t)=>{if(r=e,!i)return o.$setValidity("p3xValidateJson",!0),!0;try{return JSON.parse(e),o.$setValidity("p3xValidateJson",!0),!0}catch(e){return o.$setValidity("p3xValidateJson",!1),!1}}}}}))},2586:()=>{p3xr.ng.directive("ngEnter",(function(){return function(e,t,n){t.bind("keydown keypress",(function(t){13===t.which&&(e.$apply((function(){e.$eval(n.ngEnter)})),t.preventDefault())}))}}))},98:()=>{p3xr.ng.factory("p3xrCommon",["$mdToast","$mdDialog","$mdColors","$rootScope","p3xrRedisParser","$timeout",function(e,t,n,o,r,i){const s=e=>{let n,o,r;return e.hasOwnProperty("disableCancel")?(n=t.alert(),o=p3xr.strings.confirm.info,r=p3xr.strings.intention.ok):(n=t.confirm(),o=p3xr.strings.confirm.title,r=p3xr.strings.intention.sure),n.title(o).htmlContent(e.message).targetEvent(e.event).ok(r).multiple(!0),e.hasOwnProperty("disableCancel")||n.cancel(p3xr.strings.intention.cancel),t.show(n)},a={generalHandleError:e=>{if(void 0!==e){if(e instanceof Error||e instanceof Object||(e=new Error(e)),e instanceof Error||"error"===e.status){let t;return t=e instanceof Error?e:e.error,console.warn("generalHandleError"),console.error(t),"string"==typeof t&&p3xr.strings.code.hasOwnProperty(t)?t=new Error(p3xr.strings.code[t]):t.hasOwnProperty("code")&&p3xr.strings.code.hasOwnProperty(t.code)?t.message=p3xr.strings.code[t.code]:p3xr.strings.code.hasOwnProperty(t.message)&&(t.message=p3xr.strings.code[t.message]),a.alert({title:p3xr.strings.title.error,message:"<pre>"+(t.hasOwnProperty("message")?t.message:t)+"</pre>"}),!1}return!0}},toast:t=>{"string"==typeof t&&(t={message:t});const n='<md-toast class="md-toast p3xr-toast-default" ng-click="closeToast()">'+t.message+"</md-toast>";e.show({controller:"p3xrToastController",template:n,hideDelay:t.hideDelay||p3xr.settings.toast.timeout,position:p3xr.settings.toast.position})},alert:e=>("string"==typeof e&&(e={message:e}),e.disableCancel=!0,s(e)),confirm:s,loadRedisInfoResponse:e=>{const{response:t}=e;console.time("loadRedisInfoResponse"),o.p3xr.state.info=r.info(t.info),o.p3xr.state.keysRaw=t.keys,o.p3xr.settings.keysSort&&o.p3xr.state.keysRaw.length<=p3xr.settings.maxLightKeysCount?o.p3xr.state.keysRaw=t.keys.sort(p3xr.sort.naturalCompareDocument()):o.p3xr.state.keysRaw=t.keys,o.p3xr.state.keysInfo=t.keysInfo,i((()=>{o.p3xr.state.reducedFunctions=o.p3xr.state.keysRaw.length>p3xr.settings.maxLightKeysCount,o.$digest(),console.timeEnd("loadRedisInfoResponse")}))}};return a}]).controller("p3xrToastController",["$scope","$mdToast",function(e,t){e.closeToast=function(){t.hide()}}])},7116:()=>{p3xr.ng.factory("p3xrRedisParser",["$rootScope",function(e){return new function(){const t=this;this.array=e=>{const{line:t}=e;let{divider:n,fieldDivider:o}=e;void 0===n&&(n=","),void 0===o&&(o="=");const r=t.split(n),i={};for(let e of r){const t=e.split(o);i[t[0]]=t[1].trim()}return i},this.info=e=>{const n=e.split("\n"),o={};let r,i;for(let e of n)if(e.startsWith("#"))void 0!==r&&(o[r]=i),r=e.substring(1).toLowerCase().trim(),i={};else if(e.length>2){const n=e.split(":");i[n[0]]=n[1].includes(",")?t.array({line:n[1].trim()}):n[1].trim()}return void 0!==r&&(o[r]=i),o.hasOwnProperty("keyspace")&&(o.keyspaceDatabases={},Object.keys(o.keyspace).forEach((e=>{e=parseInt(e.substring(2)),o.keyspaceDatabases[e]=!0}))),o},this.keysToTreeControl=t=>{let{keys:n}=t,{divider:o}=t;void 0===o&&(o=p3xr.settings.redisTreeDivider);const r=[],i=[];e.expandedNodes=[];const s=(t,n=0,a=r)=>{let d=!1;if(n+1<t.length)for(let e in a){const o=a[e];o.label===t[n]&&"folder"===o.type&&(d=o)}if(!1===d){const r={label:t[n],key:t.slice(0,n+1).join(o),children:[],childCount:0};d=n+1===t.length?Object.assign(r,{type:"element",keysInfo:p3xr.state.keysInfo[r.key]}):Object.assign(r,{type:"folder"}),a.push(d);for(let t of e.savedExpandedNodes)t.key===d.key&&i.push(d)}n+1<t.length&&s(t,n+1,d.children)};e.expandedNodes=i;for(let e of n){let t;t=""===o?[e]:e.split(o),s(t)}const a={},d=e=>{a[e.key]=e.children.length;for(let t of e.children)d(t)};for(let e of r)d(e);const l=e=>{for(let t of Object.keys(a))(t.startsWith(e.key+":")||t===e.key)&&(e.childCount+=a[t]);for(let t of e.children)l(t)};for(let e of r)l(e);return e.savedExpandedNodes=[],r},this.console=new function(){this.parse=e=>{if("object"==typeof e){let t="";return Object.keys(e).forEach((n=>{""!==t&&(t+="\n"),t+=e[n]})),t}return e}}}}])},7669:(e,t,n)=>{p3xr.ng.factory("p3xrSocket",["$rootScope","p3xrCommon","$state",function(e,t,o){const r={rejectUnauthorized:!1,path:"/socket.io",secure:!0};!0===n.g.p3xrDevMode&&(r.transports=["websocket"]);const i=io.connect(p3xr.api.host,r);let s=!1;i.on("connect",(async function(){s?console.log("p3xr-socket (socket) RE-connected",i.id):console.log("p3xr-socket (socket) connected",i.id),s=!0})),i.on("disconnect",(function(){location.reload()}));let a=void 0;i.on("info-interval",(t=>{e.p3xr.state.donated=t.donated,t.donated!==a&&(n.g.p3xr.isBot()||window.gtag("config",p3xr.settings.googleAnalytics,{page_path:p3xr.state.donated?"/donated":"/free"}),a=t.donated,e.$digest())}));let d=!1;const l=async function(e){if(!d){d=!0;try{t.generalHandleError(e),o.go("socketio-error",{error:e}),await t.confirm({disableCancel:!1,message:p3xr.strings.confirm.socketioConnectError}),location.reload()}catch(e){t.generalHandleError(e)}}};i.on("error",l),i.on("connect_error",l),i.on("connections",(n=>{t.generalHandleError(n)?(p3xr.state.connections=n.connections,e.$digest()):p3xr.connectionsReset()})),i.on("redis-disconnected",(async n=>{if(void 0!==e.p3xr.state.connection&&e.p3xr.state.connection.id===n.connectionId){e.p3xr.state.connection=void 0,"error"===n.status?t.toast({message:p3xr.strings.status.redisDisconnected(n)}):"code"===n.status&&(p3xr.strings.code.hasOwnProperty(n.code)?t.toast({message:p3xr.strings.code[n.code]}):t.toast({message:"unknown redis disconnect code: "+n.code})),o.go("main");try{await m({action:"trigger-redis-disconnect",enableResponse:!1})}catch(e){t.generalHandleError(e)}}})),i.on("redis-status",(t=>{e.p3xr.state.redisConnections=t.redisConnections,setTimeout((()=>{e.$digest()}))}));let c=!1;i.on("configuration",(t=>{e.p3xr.state.cfg=t,!0===p3xr.state.cfg.snapshot?p3xr.state.version="SNAPSHOT":(p3xr.state.version="v"+p3xr.state.cfg.version,c||(c=!0,window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/version/"+p3xr.state.version}))),e.$digest()})),i.on("error",t.generalHandleError);const m=t=>{t.payload||(t.payload={}),"string"==typeof e.p3xr.state.search&&e.p3xr.state.search.length>0&&(e.p3xr.settings.searchStartsWith?t.payload.match=e.p3xr.state.search+"*":t.payload.match="*"+e.p3xr.state.search+"*"),t.payload.maxKeys=parseInt(p3xr.settings.maxKeys);let{enableResponse:n}=t;if(!1!==n&&(n=!0),n)return new Promise(((n,o)=>{t.requestId=p3xr.nextId();const r="p3xr-response-"+t.requestId;let s;const a=t=>{if(clearTimeout(s),i.off(r),"ok"===t.status)n(t);else{const e=new Error(t.error);o(e)}e.$digest()};s=setTimeout((()=>{i.off(r,a),o(new Error(p3xr.strings.label.socketIoTimeout({timeout:p3xr.settings.socket.timeout}))),e.$digest()}),p3xr.settings.socket.timeout),i.on(r,a),i.emit("p3xr-request",t)}));i.emit("p3xr-request",t)};return{ioClient:i,request:m}}])},8136:(e,t,n)=>{n(5548),n(4762),n(66),n(933),n(7753),n(6051),n(6474),n(2586),n(98),n(7116),n(7669),n(2912),n(2111),n(6553),n(7075),n(3285),n(6961),n(2712),n(9825),n(9947),n(669),n(5214),n(3207),n(7601),n(6889),n(1502),n(4370),n(3888),n(8404),n(9767),n(2526),n(2974),n(6298),n(8498),n(9606),n(7713),n(57)},2912:(e,t,n)=>{p3xr.ng.component("p3xrLayout",{template:n(134),controller:["p3xrTheme","$rootScope","p3xrSocket","p3xrCommon","$state","$cookies","$timeout","$scope",function(e,t,o,r,i,s,a,d){let l;this.getThemeKey=e=>{if(void 0===l){const t=Object.keys(e);l=t.sort(((t,n)=>e[t].order-e[n].order))}return l},this.getVersionColor=()=>"p3xrThemeMatrix"===e.getCurrentThemeName()?"grey-900":"background-A100",this.setTheme=t=>{e.setTheme(e.generateThemeName(t))},this.openLink={github:()=>{window.open("https://github.com/patrikx3/redis-ui","github-patrikx3-redis-ui")},githubRelease:()=>{window.open("https://github.com/patrikx3/redis-ui/releases","github-patrikx3--redis-ui-releases")},githubChangelog:()=>{window.open("https://github.com/patrikx3/redis-ui/blob/master/changelog.md#change-log","github-patrikx3-redis-ui-changelog")},donate:()=>{window.open("https://www.paypal.me/patrikx3","p3x-redis-ui-donate")}};const c=n(268);let m;Object.defineProperty(this,"themeSelectedKey",{get:()=>{let e=p3xr.state.theme;return e=e.slice("p3xrTheme".length),e=c(e),e}});const p=()=>{m.css("left",document.documentElement.clientWidth/2-m.outerWidth()/2+"px")};this.reducedFunctionalty=()=>{r.confirm({disableCancel:!0,message:p3xr.strings.label.tooManyKeys({count:t.p3xr.state.keysRaw.length,maxLightKeysCount:p3xr.settings.maxLightKeysCount})})},this.$onInit=()=>{m=$("#p3xr-layout-reduced"),p(),$window.on("resize",p);const e=s.getObject(p3xr.settings.connectInfo.cookieName);void 0!==e&&this.connect(e),a((()=>{n.g.p3xrSetLanguage=e=>{t.$apply((()=>{t.isElectron=!0,this.setLanguage(e)}))},n.g.p3xrSetMenu=e=>{t.$apply((()=>{t.isElectron=!0,i.go(e)}))}}),3e3)},this.$onDestroy=function(){$window.off("resize",p)},n.g.p3xr.isBot()||t.$on("$locationChangeSuccess",(async function(e,t,n){const o=new URL(t);o.pathname.toLowerCase().startsWith("/main/key/")?window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/main/key"}):(console.log("$locationChangeSuccess gtag",o.pathname),window.gtag("config",p3xr.settings.googleAnalytics,{page_path:o.pathname}))})),this.connect=async(e,n=!1)=>{console.time("connect"),e=angular.copy(e);try{const a=location.pathname.split("/");a.shift();let d=a.join(".");""===d&&(d="main"),p3xr.ui.overlay.show({message:p3xr.strings.title.connectingRedis});const l=s.get(p3xr.settings.connection.getCookieNameCurrentDatabase(e.id)),c=await o.request({action:"connection-connect",payload:{connection:e,db:l}});t.p3xr.state.page=1,p3xr.state.dbsize=c.dbsize;let m=0;const p=[];for(;m<c.databases;)p.push(m++);p3xr.state.commands=[],Object.keys(c.commands).forEach((e=>{p3xr.state.commands.push(c.commands[e][0])})),p3xr.state.commands.sort(),t.p3xr.state.databaseIndexes=p,t.p3xr.state.connection=e,r.loadRedisInfoResponse({response:c}),s.putObject(p3xr.settings.connectInfo.cookieName,e,{expires:p3xr.settings.cookieExpiry}),!0===n&&d.startsWith("main.key")&&(d="main"),d.startsWith("main")?"main"===d&&i.go("main.statistics"):i.go(d)}catch(e){s.remove(p3xr.settings.connectInfo.cookieName),t.p3xr.state.connection=void 0,r.generalHandleError(e)}finally{p3xr.ui.overlay.hide()}console.timeEnd("connect")},this.disconnect=async()=>{try{s.remove(p3xr.settings.connectInfo.cookieName),await o.request({action:"connection-disconnect",payload:{connectionId:p3xr.state.connection.id}}),t.p3xr.state.connection=void 0}catch(e){r.generalHandleError(e)}finally{i.go("main")}},Object.defineProperty(this,"connectionName",{get:()=>void 0!==t.p3xr.state.connection?t.p3xr.strings.label.connected({name:t.p3xr.state.connection.name}):t.p3xr.strings.intention.connect}),this.isMain=()=>i.current.name.startsWith("main"),this.isElectronInitialized=!1,this.setLanguage=async e=>{try{t.p3xr.settings.language.current=e,t.isElectron&&(await o.request({action:"set-language",payload:{key:e}}),this.isElectronInitialized=!0,d.$digest())}catch(e){r.generalHandleError(e)}}}]})},2111:(e,t,n)=>{p3xr.ng.component("p3xrMainKeyHash",{template:n(176),bindings:{p3xrValue:"=",p3xrKey:"<",p3xrResponse:"<"},controller:["p3xrCommon","p3xrSocket","p3xrDialogJsonView","p3xrDialogKeyNewOrSet","$rootScope",function(e,t,o,r,i){this.copy=t=>{n.g.p3xr.clipboard({value:t.value}),e.toast(p3xr.strings.status.dataCopied)},this.addHash=async t=>{try{await r.show({type:"append",$event:t.$event,model:{type:"hash",key:this.p3xrKey}}),i.$broadcast("p3x-refresh-key")}catch(t){e.generalHandleError(t)}},this.deleteHashKey=async n=>{try{await e.confirm({event:n.$event,message:p3xr.strings.confirm.deleteHashKey}),await t.request({action:"key-hash-delete-field",payload:{key:this.p3xrKey,hashKey:n.hashKey}}),i.$broadcast("p3x-refresh-key")}catch(t){e.generalHandleError(t)}},this.editValue=async t=>{try{const{hashKey:e,value:n}=t;await r.show({type:"edit",$event:t.$event,model:{type:"hash",value:n,hashKey:e,key:this.p3xrKey}}),i.$broadcast("p3x-refresh-key")}catch(t){e.generalHandleError(t)}},this.showJson=e=>{const{value:t}=e;o.show({value:t})}}]})},6553:(e,t,n)=>{p3xr.ng.component("p3xrMainKeyList",{template:n(2585),bindings:{p3xrValue:"=",p3xrKey:"<",p3xrResponse:"<"},controller:["$mdColors","p3xrCommon","p3xrSocket","$rootScope","p3xrDialogJsonView","p3xrDialogKeyNewOrSet",function(e,t,o,r,i,s){this.copy=e=>{n.g.p3xr.clipboard({value:e.value}),t.toast(p3xr.strings.status.dataCopied)},this.appendValue=async e=>{try{const{index:t,value:n}=e;await s.show({type:"append",$event:e.$event,model:{type:"list",key:this.p3xrKey}}),r.$broadcast("p3x-refresh-key")}catch(e){t.generalHandleError(e)}},this.editValue=async e=>{try{const{index:t,value:n}=e;await s.show({type:"edit",$event:e.$event,model:{type:"list",value:n,index:e.index,key:this.p3xrKey}}),r.$broadcast("p3x-refresh-key")}catch(e){t.generalHandleError(e)}},this.deleteListElement=async e=>{try{await t.confirm({event:e.$event,message:p3xr.strings.confirm.deleteListItem});await o.request({action:"key-list-delete-index",payload:{key:this.p3xrKey,index:e.index}});r.$broadcast("p3x-refresh-key")}catch(e){t.generalHandleError(e)}},this.showJson=e=>{const{value:t}=e;i.show({value:t})}}]})},7075:(e,t,n)=>{p3xr.ng.component("p3xrMainKeySet",{template:n(7129),bindings:{p3xrValue:"=",p3xrKey:"<",p3xrResponse:"<"},controller:["p3xrCommon","p3xrSocket","p3xrDialogJsonView","p3xrDialogKeyNewOrSet","$rootScope",function(e,t,o,r,i){this.copy=t=>{n.g.p3xr.clipboard({value:t.value}),e.toast(p3xr.strings.status.dataCopied)},this.addSet=async t=>{try{await r.show({type:"append",$event:t.$event,model:{type:"set",key:this.p3xrKey}}),i.$broadcast("p3x-refresh-key")}catch(t){e.generalHandleError(t)}},this.deleteSetMember=async n=>{try{await e.confirm({event:n.$event,message:p3xr.strings.confirm.deleteSetMember}),await t.request({action:"key-set-delete-member",payload:{key:this.p3xrKey,value:n.value}}),i.$broadcast("p3x-refresh-key")}catch(t){e.generalHandleError(t)}},this.editValue=async t=>{try{const{value:e}=t;await r.show({type:"edit",$event:t.$event,model:{type:"set",value:e,key:this.p3xrKey}}),i.$broadcast("p3x-refresh-key")}catch(t){e.generalHandleError(t)}},this.showJson=e=>{const{value:t}=e;o.show({value:t})}}]})},3285:(e,t,n)=>{p3xr.ng.component("p3xrMainKeyString",{template:n(9263),bindings:{p3xrValue:"=",p3xrKey:"<",p3xrResponse:"<"},controller:["p3xrSocket","p3xrCommon","$rootScope","p3xrDialogJsonView","p3xrDialogJsonEditor",function(e,t,o,r,i){let s;this.copy=()=>{n.g.p3xr.clipboard({value:this.p3xrValue}),t.toast(p3xr.strings.status.dataCopied)},this.editable=!1,this.edit=()=>{s=angular.copy(this.p3xrValue),this.editable=!0},this.cancelEdit=()=>{this.p3xrValue=s,this.editable=!1},this.validateJson=!1,this.save=async()=>{try{if(!0===this.validateJson)try{JSON.parse(this.p3xrValue)}catch(e){return void t.toast({message:p3xr.strings.label.jsonViewNotParsable})}await e.request({action:"key-set",payload:{type:this.p3xrResponse.type,value:this.p3xrValue,key:this.p3xrKey}});window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/key-set"}),this.editable=!1}catch(e){t.generalHandleError(e)}finally{o.$broadcast("p3x-refresh-key")}},this.jsonViewer=e=>{r.show({event:e.$event,value:this.p3xrValue})},this.jsonEditor=async e=>{try{const t=await i.show({event:e.$event,value:this.p3xrValue});this.p3xrValue=t.obj,await this.save()}catch(e){t.generalHandleError(e)}},this.formatJson=async()=>{try{this.p3xrValue=JSON.stringify(JSON.parse(this.p3xrValue),null,p3xr.settings.jsonFormat),await this.save()}catch(e){t.toast({message:p3xr.strings.label.jsonViewNotParsable})}}}]})},6961:(e,t,n)=>{p3xr.ng.component("p3xrMainKeyZset",{template:n(508),bindings:{p3xrValue:"=",p3xrKey:"<",p3xrResponse:"<"},controller:["$scope","p3xrCommon","p3xrSocket","p3xrDialogJsonView","p3xrDialogKeyNewOrSet","$rootScope",function(e,t,o,r,i,s){this.copy=e=>{n.g.p3xr.clipboard({value:e.value}),t.toast(p3xr.strings.status.dataCopied)};let a;e.$watch("$ctrl.p3xrValue",((e,t)=>{e!==a&&(a=e,this.generatedValue=(e=>{const t=[];let n=void 0;for(let o of e)void 0===n?n=o:(t.push([parseFloat(o),n]),n=void 0);return t})(this.p3xrValue))})),this.showJson=e=>{const{value:t}=e;r.show({value:t})},this.addZSet=async e=>{try{await i.show({type:"append",$event:e.$event,model:{type:"zset",key:this.p3xrKey}}),s.$broadcast("p3x-refresh-key")}catch(e){t.generalHandleError(e)}},this.deleteZSet=async e=>{try{await t.confirm({event:e.$event,message:p3xr.strings.confirm.deleteZSetMember}),await o.request({action:"key-zset-delete-member",payload:{key:this.p3xrKey,value:e.member}}),s.$broadcast("p3x-refresh-key")}catch(e){t.generalHandleError(e)}},this.editValue=async e=>{try{const{member:t}=e;await i.show({type:"edit",$event:e.$event,model:{type:"zset",score:e.score,value:t,key:this.p3xrKey}}),s.$broadcast("p3x-refresh-key")}catch(e){t.generalHandleError(e)}}}]})},2712:(e,t,n)=>{p3xr.ng.component("p3xrMainKey",{template:n(9868),bindings:{p3xrResize:"&"},controller:["p3xrCommon","p3xrRedisParser","p3xrSocket","$rootScope","$stateParams","$timeout","$scope","$mdDialog","$state","$interval","p3xrDialogTtl","p3xrTheme","$mdColors",function(e,t,o,r,i,s,a,d,l,c,m,p,u){this.$stateParams=i;let g=!1;const x=()=>!(this.response.ttl<-1||g&&this.response.ttl<1)||(e.toast({message:p3xr.strings.status.keyIsNotExisting}),c.cancel(h),p3xr.state.redisChanged=!0,l.go("main.statistics"),!1);let h;const f=n(4848),y=()=>{if(this.response.ttl>-1){const e=()=>{if(x()){let e;switch(p3xr.settings.language.current){case"zn":e="zh_CN";break;default:e="en"}this.ttlParsed=" "+f(1e3*this.response.ttl,{language:e,delimiter:" "});const t=document.getElementById("p3xr-main-key-ttl-counter");t&&(t.innerText=this.ttlParsed)}else c.cancel(h)};e(),r.p3xr.state.reducedFunctions||(h=c((()=>{this.response.ttl=this.response.ttl-1,e()}),1e3))}},v=async(t={})=>{c.cancel(h);let{withoutParent:n}=t;void 0===n&&(n=!1);let r=void 0;try{p3xr.ui.overlay.show({message:p3xr.strings.intention.getKey});const e=await o.request({action:"key-get",payload:{key:i.key}});this.response=e;const t=e.type;if(-2===e.ttl)return void x();switch(t){case"string":e.length=e.value.length}e.ttl>-1&&(g=!0),y(),a.$digest()}catch(t){r=t,console.error(t),e.alert(p3xr.strings.label.unableToLoadKey({key:i.key}))}finally{p3xr.ui.overlay.hide(),void 0!==r?l.go("main.statistics"):n||null===i.resize||i.resize()}},b=()=>{$("#p3xr-theme-styles-tree-key").remove(),$("head").append(`<style id="p3xr-theme-styles-tree-key">\n[data-p3xr-tree-key="${p3xr.ui.htmlEncode(i.key)}"] {\n    background-color: ${p.isDark()?u.getThemeColor(p3xr.state.themeCommon+"-accent-300"):u.getThemeColor(p3xr.state.themeCommon+"-accent")} !important;\n    color: ${p.isDark()?"black":"white"} !important;\n    padding: 2px;\n}\n</style>`)};this.$onInit=()=>{v(),b()},a.$on("p3xr-theme-switched",b),this.$onDestroy=function(){$("#p3xr-theme-styles-tree-key").remove(),c.cancel(h)},this.charactersPrettyBytes=e=>{if(e<1024||void 0===e)return"";return"("+n(2315)(e)+")"},this.refresh=async e=>{window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/refresh"}),await v(e),a.$digest()},this.rename=async e=>{r.$broadcast("p3xr-key-rename",{key:i.key,$event:e.$event})},this.delete=async e=>{r.$broadcast("p3xr-key-delete",{key:i.key,$event:e.$event})},this.setTtl=async t=>{try{const n=await m.show({$event:t.$event,model:{ttl:-1===this.response.ttl?"":this.response.ttl}});if(void 0===n)return;if(null==n.model.ttl||""===String(n.model.ttl).trim()){await o.request({action:"persist",payload:{key:i.key}});window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/persist"}),await this.refresh(),e.toast({message:p3xr.strings.status.persisted})}else if(String(n.model.ttl).match(/^-{0,1}\d+$/)){await o.request({action:"expire",payload:{key:i.key,ttl:parseInt(n.model.ttl)}});window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/expire"}),await this.refresh(),e.toast({message:p3xr.strings.status.ttlChanged})}else e.toast({message:p3xr.strings.status.notInteger})}catch(t){e.generalHandleError(t)}},a.$on("p3x-refresh",(()=>{this.refresh({withoutParent:!0})})),a.$on("p3x-refresh-key",(()=>{this.refresh({withoutParent:!0})}))}]})},9825:(e,t,n)=>{p3xr.ng.component("p3xrMainStatistics",{template:n(4498),controller:["p3xrCommon","p3xrRedisParser","p3xrSocket","$rootScope","$scope","$timeout","$stateParams","$mdMedia",function(e,t,n,o,r,i,s,a){const d=["in","run","per"],l=["sha1"],c={perc:"percent",sec:"seconds"};let m=!0;const p=()=>{this.maxHeight=m?"auto":document.getElementById("p3xr-main-content-container").offsetHeight-50};r.$watch((()=>a("xs")),((e,t)=>{m=e,p()})),$window.on("resize",p),this.$doCheck=p,this.$onInit=()=>{p3xr.state.redisChanged&&(p3xr.state.redisChanged=!1,o.$broadcast("p3x-refresh"))},this.$onDestroy=()=>{$window.off("resize",p)},this.hasDatabases=Object.keys(o.p3xr.state.info.keyspaceDatabases).length>0,this.generateKey=e=>{if(p3xr.strings.title.hasOwnProperty(e))return p3xr.strings.title[e];return e.split("_").map(((e,t)=>(c.hasOwnProperty(e)&&(e=c[e]),l.includes(e)||e.length<4&&!d.includes(e)?e.toUpperCase():0===t?e[0].toUpperCase()+e.substring(1):e))).join(" ")}}]})},9947:(e,t,n)=>{p3xr.ng.component("p3xrMainTreecontrolControls",{template:n(3646),bindings:{p3xrMainRef:"<"},controller:["$cookies","$rootScope","p3xrCommon","$timeout","p3xrDialogTreecontrolSettings","$scope",function(e,t,n,o,r,i){this.treeExpandAll=()=>{try{p3xr.ui.overlay.show({message:p3xr.strings.status.treeExpandAll});let e=[];const n=(t,o=0)=>{if(delete t.$inview,"folder"===t.type){e.push(t);for(let e of t.children)n(e,o++)}};for(let e of t.keysTreeRendered)n(e);t.expandedNodes=e}catch(e){n.generalHandleError(e)}finally{p3xr.ui.overlay.hide()}},this.treeCollapseAll=()=>{t.expandedNodes=[],t.$broadcast("p3xr-main-treecontrol-control-noop")},i.$on("p3xr-main-treecontrol-control-noop",(()=>{o((()=>{$("#p3xr-main-treecontrol-controls-click-noop").click()}))})),this.noop=()=>{},this.page=e=>{const{page:n}=e;switch(n){case"prev":t.p3xr.state.page-1>=1&&(t.p3xr.state.page=t.p3xr.state.page-1);break;case"next":t.p3xr.state.page+1<=t.p3xr.state.pages&&(t.p3xr.state.page=t.p3xr.state.page+1);break;case"last":t.p3xr.state.page=t.p3xr.state.pages;break;case"first":t.p3xr.state.page=1}o((()=>{t.$digest()}))},this.pageChange=()=>{t.p3xr.state.page<1?t.p3xr.state.page=1:t.p3xr.state.page>t.p3xr.state.pages&&(t.p3xr.state.page=t.p3xr.state.pages)},this.openTreeSettingDialog=e=>{e.p3xrMainRef=this.p3xrMainRef,r.show(e)},this.search="",this.$onInit=()=>{this.search=t.p3xr.state.search},this.onSearchChange=()=>{t.p3xr.settings.searchClientSide?t.p3xr.state.redisChanged=!0:this.p3xrMainRef.refresh(),t.p3xr.state.page=1},this.treeDividerChange=()=>{t.p3xr.state.redisChanged=!0,t.$broadcast("p3x-refresh")}}]})},669:(e,t,n)=>{p3xr.ng.component("p3xrMainTree",{template:n(5484),bindings:{p3xrResize:"&",p3xrMainRef:"<"},controller:["p3xrCommon","p3xrRedisParser","p3xrSocket","$rootScope","$timeout","$state","$scope","$mdDialog","p3xrDialogKeyNewOrSet","p3xrTheme","$stateParams",function(e,t,o,r,i,s,a,d,l,c,m){this.displayNode=(e,t)=>{e.$inview=t},this.getTreeTheme=()=>c.isDark()?"tree-dark":"tree-classic",this.keysTreeOptions={nodeChildren:"children",dirSelectable:!1,multiSelection:!1},this.selectTreeNode=function(e,t,n,o,r,i,a,d,l,c){s.go("main.key",{key:e.key,resize:this.p3xrResize})},this.showToggle=function(e,t,o,i,s,a,d,l,c,m){t||n(554).recursive({nodes:r.keysTreeRendered}),r.$broadcast("p3xr-main-treecontrol-control-noop")},this.delete=async t=>{try{await e.confirm({event:t.$event,message:p3xr.strings.confirm.deleteKey});const n=angular.copy(r.expandedNodes),a=await o.request({action:"delete",payload:{key:t.key}});window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/delete"}),i((()=>{r.savedExpandedNodes=n,e.loadRedisInfoResponse({response:a})})),s.go("main.statistics"),e.toast({message:p3xr.strings.status.deletedKey({key:t.key})})}catch(t){e.generalHandleError(t)}},this.rename=async t=>{try{const n=d.prompt().title(p3xr.strings.confirm.rename.title).textContent(p3xr.strings.confirm.rename.textContent).placeholder(p3xr.strings.confirm.rename.placeholder).ariaLabel(p3xr.strings.confirm.rename.placeholder).initialValue(t.key).targetEvent(t.$event).required(!0).ok(p3xr.strings.intention.rename).cancel(p3xr.strings.intention.cancel),a=await d.show(n),l=angular.copy(r.expandedNodes),c=await o.request({action:"rename",payload:{key:t.key,keyNew:a}});window.gtag("config",p3xr.settings.googleAnalytics,{page_path:"/rename"}),i((()=>{r.savedExpandedNodes=l,e.loadRedisInfoResponse({response:c}),s.go("main.key",{key:a,resize:this.p3xrResize})})),e.toast({message:p3xr.strings.status.renamedKey})}catch(t){e.generalHandleError(t)}},this.deleteTree=async t=>{try{const{event:n,node:a}=t;n.stopPropagation();const d=angular.copy(r.expandedNodes);await e.confirm({event:n,message:p3xr.strings.confirm.deleteAllKeys({key:a.key})});const l=await o.request({action:"key-del-tree",payload:{key:a.key,redisTreeDivider:p3xr.settings.redisTreeDivider}});i((()=>{r.savedExpandedNodes=d,e.loadRedisInfoResponse({response:l}),void 0!==m.key&&m.key.startsWith(a.key+p3xr.settings.redisTreeDivider)&&s.go("main.statistics")})),e.toast({message:p3xr.strings.status.treeDeleted({key:a.key})})}catch(t){e.generalHandleError(t)}},this.extractNodeTooltip=e=>"folder"!==e.type&&void 0!==e.keysInfo?void 0===e.keysInfo?"":p3xr.ui.htmlEncode(p3xr.strings.redisTypes[e.keysInfo.type]+" - "+e.key):p3xr.ui.htmlEncode(e.key),this.extractNodeKey=e=>"folder"===e.type?"":p3xr.ui.htmlEncode(e.key),this.addKey=async t=>{const{event:n,node:o}=t;n.stopPropagation();const a=angular.copy(r.expandedNodes);try{const t=await l.show({$event:n,node:o,type:"add"});i((()=>{r.savedExpandedNodes=a,e.loadRedisInfoResponse({response:t}),s.go("main.key",{key:t.key,resize:this.p3xrResize})}))}catch(t){e.generalHandleError(t)}},a.$on("p3xr-key-delete",((e,t)=>{this.delete(t)})),a.$on("p3xr-key-rename",((e,t)=>{this.rename(t)})),a.$on("p3xr-key-new",((e,t)=>{this.addKey(t)})),this.treeHover=({node:e})=>{!0!==p3xr.state.connection.readonly&&(e.show=!0)}}]})},5214:(e,t,n)=>{let o=[],r=-1;const i=n.g.htmlEncode;p3xr.ng.component("p3xrConsole",{template:n(8236),controller:["p3xrCommon","p3xrSocket","$state","$rootScope","p3xrRedisParser","$mdDialog","$timeout",function(e,t,s,a,d,l,c){const m=p3xr.state.commands;let p,u,g,x,h,f,y;a.hasConnected()||s.go("main");const v=n(7280),b=()=>{let e,t=0;e=[u,g,x];for(let n of e)t+=n.outerHeight();const n=$window.height(),o=Math.max(n-t-70,0);p.height(o),p.css("max-height",o+"px")},k=v(b,p3xr.settings.debounce),w=e=>{if(!1===p3xr.state.monitor)return;let t=i(String(e.message));f.append("<strong>PubSub channel:</strong> "+e.channel),f.append(`<pre>${t}</pre><br/>`),y.scrollTop=y.scrollHeight};let C,S,T,E;this.$onInit=()=>{p=$("#p3xr-console-content"),u=$("#p3xr-layout-header-container"),g=$("#p3xr-layout-footer-container"),x=$("#p3xr-console-header"),h=$("#p3xr-console-input"),f=$("#p3xr-console-content-output"),h.focus(),y=p[0],$window.on("resize",k),k(),this.clearConsole(),t.ioClient.on("pubsub-message",w)},this.$postLink=()=>{b()},this.$onDestroy=function(){$window.off("resize",k),t.ioClient.removeListener("pubsub-message",w)},this.inputValue="",this.actionEnter=async()=>{let e;const n=String(this.inputValue).trim();if(""!==n)try{f.append(`<div class="p3xr-console-content-output-item">${n}</div>`),this.inputValue="",e=await t.request({action:"console",payload:{command:n}});const s=i(String(d.console.parse(e.result)));f.append(`<pre>${s}</pre>`),e.hasOwnProperty("database")&&(a.p3xr.state.currentDatabase=e.database,a.p3xr.state.redisChanged=!0)}catch(e){console.error(e),f.append(`<pre>${e.message}</pre>`)}finally{let t;t=void 0!==e?e.generatedCommand:n;const i=o.indexOf(t);i>-1&&o.splice(i,1),o.push(t),r=-1,y.scrollTop=y.scrollHeight,h.focus()}};const D=()=>{c((()=>{const e=h.val();h.val("").focus().val(e)}))};this.action=e=>{switch(9!==e.keyCode&&!0!==event.shiftKey&&(C=void 0,S=-1,T=[],E=!1),e.keyCode){case 13:return this.actionEnter();case 38:if(o.length<1)return;-1===r&&(r=o.length),r--,r>-1||(r=o.length-1),this.inputValue=o[r],D();break;case 40:if(o.length<1)return;r++,r>=o.length||(r=0),this.inputValue=o[r],D();break;case 9:if(void 0===this.inputValue&&(this.inputValue=""),!E){const e=String(this.inputValue).trim();C=e,S=-1,T=""===C?m:m.filter((e=>e.startsWith(C.toLowerCase())))}!0===event.shiftKey?S--:S++,S>=T.length?S=0:S<0&&(S=T.length-1),this.inputValue=T[S],e.stopPropagation(),e.preventDefault(),E=!0;break;default:r=-1}},this.clearConsole=()=>{f.empty(),f.append('<div class="p3xr-console-content-output-item"><strong>'+a.p3xr.strings.label.welcomeConsole+"</strong></div>"),f.append('<div class="p3xr-console-content-output-item">'+a.p3xr.strings.label.welcomeConsoleInfo+"</div>"),f.append('<div class="p3xr-console-content-output-item">'+a.p3xr.strings.label.welcomeConsoleInfo2+"</div>"),h.focus()},this.commands=e=>{l.show({controller:["$scope","$mdDialog",function(e,t){e.ok=function(){t.hide()},e.$watch((function(){return $("#p3xr-console-commands").parent().height()}),((t,n)=>{e.height=t}))}],fullscreen:!0,targetEvent:e.$event,template:'\n<md-dialog aria-label="{{ $root.p3xr.strings.intention.commands }}" layout-fill>\n  <md-toolbar md-theme="{{$root.p3xr.state.themeLayout}}">\n      <div class="md-toolbar-tools">\n        <md-icon>keyboard</md-icon>\n        &nbsp;\n        {{ $root.p3xr.strings.intention.commands }}\n        <span flex></span>\n         <md-button class="md-icon-button" ng-click="ok()" aria-label="{{ $root.p3xr.strings.intention.close }}">\n           <md-icon>close</md-icon>\n      </md-button>\n      </div>\n    </md-toolbar>\n\n    <md-dialog-content flex>\n      <div id="p3xr-console-commands">\n        <iframe seamless="seamless" src="https://redis.io/commands" frameborder="0" style="width: 100%; height: {{ height - 15 }}px;"></iframe>\n      </div>\n    </md-dialog-content>\n\n    <md-dialog-actions layout="row">\n      <span flex></span>\n      <md-button ng-click="ok()"  class="md-raised md-primary" aria-label="{{ $root.p3xr.strings.intention.close }}">\n        <md-icon>close</md-icon>\n        {{ $root.p3xr.strings.intention.close }}\n      </md-button>\n    </md-dialog-actions>\n</md-dialog>\n          '})}}]})},3207:(e,t,n)=>{p3xr.ng.component("p3xrError",{template:n(4007),controller:["$stateParams","$rootScope",function(e,t){this.$stateParams=e,t.p3xr.state.failed=!0}]})},7601:(e,t,n)=>{p3xr.ng.component("p3xrMain",{template:n(1856),controller:["$cookies","p3xrSocket","p3xrCommon","p3xrRedisParser","$rootScope","$state","$timeout","$scope","$mdMedia",function(e,t,o,r,i,s,a,d,l){let c,m,p,u,g,x,h=!1,f=!1,y=void 0;Object.defineProperty(d,"resizerColor",{get:()=>f||h?"accent-400":"accent",set:e=>{}});const v=p3xr.settings.resizeMinWidth,b=n(7280);let k,w=!1;d.$watch((function(){return l("xs")}),(function(e){e||!0!==w||(void 0!==k&&a.cancel(k),k=a(S,4*p3xr.settings.debounce)),w=e}));const C=(e={})=>{let t,n=0;t=[m,p,u];for(let e of t)n+=e.outerHeight();const o=$window.outerHeight(),r=Math.max(o-n-11,100);c.height(r),c.css("max-height",r+"px");const i=p3xr.dom.getPosition(c[0]),s=$("#p3xr-main-treecontrol-container");if(s){const e=$("#p3xr-main-treecontrol-controls-container"),t=p3xr.dom.getPosition(e[0]);s.css("top",i.top+t.height+"px"),s.css("left",i.left+"px"),s.css("height",i.height-t.height+"px"),s.css("max-height",i.height+"px"),void 0!==y?s.css("width",y-i.left+"px"):s.css("width",v+"px"),s.css("min-width",v+"px");const n=p3xr.dom.getPosition(s[0]);void 0===x&&N();const o=5;void 0!==x&&(x=document.getElementById("p3xr-main-content-sizer"),null!==x&&(x.addEventListener("mouseover",T),x.addEventListener("mouseout",E),x.style.top=i.top+"px",x.style.height=i.height+"px",x.style.left=i.left+n.width+"px",x.style.width=o+"px"));const r=$("#p3xr-main-content-container");r.css("top",i.top+"px"),r.css("height",i.height+"px"),r.css("left",i.left+n.width+o+"px"),r.css("width",i.width-n.width-o+"px"),e.width(n.width)}else j()},S=b((()=>{y=void 0,C()}),p3xr.settings.debounce),T=()=>{h=!0,d.$digest()},E=()=>{h=!1,d.$digest()},D=e=>{"mousedown"===e.type&&"p3xr-main-content-sizer"!==e.target.id||("mousedown"===e.type?(f=!0,document.documentElement.style.cursor="ew-resize",$body.addClass("p3xr-not-selectable")):"mouseup"===e.type&&(document.documentElement.style.cursor="auto",f=!1,$body.removeClass("p3xr-not-selectable")),!1===f&&C({}),e.stopPropagation(),d.$digest())},P=e=>{if(f){const t=p3xr.dom.getPosition(c[0]);e.clientX<t.left+v||e.clientX>window.innerWidth-v?document.documentElement.style.cursor="not-allowed":(document.documentElement.style.cursor="ew-resize",x.style.left=e.clientX+"px",y=e.clientX,C())}},N=()=>{x=document.getElementById("p3xr-main-content-sizer"),null!==x?(x.addEventListener("mouseover",T),x.addEventListener("mouseout",E),document.addEventListener("mousemove",P),document.addEventListener("mousedown",D),document.addEventListener("mouseup",D)):x=void 0};d.$on("p3xr-main-resizer",((e,t)=>{console.info("p3xr-main-resizer dragging:",t.drag),!0===t.drag?(document.addEventListener("mousemove",P),document.addEventListener("mousedown",D),document.addEventListener("mouseup",D)):(document.removeEventListener("mousemove",P),document.removeEventListener("mousedown",D),document.removeEventListener("mouseup",D))}));const j=()=>{null!=x&&(x.removeEventListener("mouseover",T),x.removeEventListener("mouseout",E),x=void 0),document.removeEventListener("mousedown",D),document.removeEventListener("mouseup",D),document.removeEventListener("mousemove",P)};this.resize=b(C,p3xr.settings.debounce),this.resizeRaw=C,this.$onInit=()=>{n(554).recursive({nodes:i.keysTreeRendered}),c=$("#p3xr-main-content"),m=$("#p3xr-layout-header-container"),p=$("#p3xr-layout-footer-container"),u=$("#p3xr-main-header"),g=c[0],C(),$window.on("resize",C),"/main"===s.current.url&&s.go("main.statistics"),p3xr.state.redisChanged&&(p3xr.state.redisChanged=!1,p3xr.state.connection&&this.refresh()),0===p3xr.state.connections.list.length&&void 0===p3xr.state.connection&&setTimeout((()=>{C()}))},this.$onDestroy=function(){$window.off("resize",C),j()},i.p3xr.state.page=1;let M,V,R=0;Object.defineProperty(this,"currentDatabase",{get:()=>{let t=p3xr.state.currentDatabase;return void 0===t&&(t=e.get(p3xr.settings.connection.getCookieNameCurrentDatabase(p3xr.state.connection.id))),void 0===t&&(t=0),t},set:async n=>{if(M=n,R!==M){R=n;try{await t.request({action:"console",payload:{command:"select "+R}})}catch(e){o.generalHandleError(e)}}e.put(p3xr.settings.connection.getCookieNameCurrentDatabase(p3xr.state.connection.id),String(n),{expires:p3xr.settings.cookieExpiry})}}),this.selectDatabase=async e=>{this.currentDatabase=e;try{i.p3xr.state.page=1;await t.request({action:"console",payload:{command:"select "+e}});o.toast({message:p3xr.strings.status.dbChanged({db:e})}),await this.statistics()}catch(e){o.generalHandleError(e)}},this.save=async()=>{try{const e=await t.request({action:"save"});i.p3xr.state.info=r.info(e.info),i.$digest(),o.toast({message:p3xr.strings.status.savedRedis})}catch(e){o.generalHandleError(e)}},this.statistics=async()=>{try{s.go("main.statistics"),await this.refresh()}catch(e){o.generalHandleError(e)}},this.refresh=async(e={})=>{console.time("refresh");let{withoutParent:n}=e;void 0===n&&(n=!1);try{p3xr.ui.overlay.show({message:p3xr.strings.status.reloadingDataInfo});const e={};!i.p3xr.settings.searchClientSide&&"string"==typeof i.p3xr.state.search&&i.p3xr.state.search.length>0&&(i.p3xr.settings.searchStartsWith?e.match=i.p3xr.state.search+"*":e.match="*"+i.p3xr.state.search+"*");const r=await t.request({action:"refresh",payload:e});p3xr.state.dbsize=r.dbsize,o.loadRedisInfoResponse({response:r}),n||i.$broadcast("p3x-refresh-key")}catch(e){o.generalHandleError(e)}finally{p3xr.ui.overlay.hide()}console.timeEnd("refresh")},d.$on("p3x-refresh",(()=>{this.refresh({withoutParent:!0})}));let I=new ResizeObserver((e=>{f||C()}));d.$watch((()=>(l("xs")?"true":"false")+"-"+(p3xr.state.connection?"true":"false")),(async(e,t)=>{if(V&&I.unobserve(V),void 0===p3xr.state.connection)return void console.log("no connection for resizing");if(l("xs"))return void C();let n=null;for(;null===n;)n=document.getElementById("p3xr-main-treecontrol-controls-container"),console.info("waiting for observing tree control controls"),await new Promise((e=>setInterval(e)));console.info("found observing tree control controls"),V=n,I.observe(V)})),d.$on("$destroy",(()=>{I.disconnect()})),this.addKey=e=>{const{event:t,node:n}=e;t.stopPropagation(),i.$broadcast("p3xr-key-new",{event:t,node:n})}}]})},6889:()=>{},1502:(e,t,n)=>{p3xr.ng.component("p3xrSettings",{template:n(2305),controller:["p3xrCommon","p3xrDialogConnection","$mdDialog","p3xrSocket","p3xrDialogTreecontrolSettings",function(e,t,o,r,i){this.connectionForm=e=>{t.show(e)},this.setLicense=async t=>{try{const i=o.prompt().title(p3xr.strings.confirm.license.title).textContent(p3xr.strings.confirm.license.textContent).placeholder(p3xr.strings.confirm.license.placeholder).ariaLabel(p3xr.strings.confirm.license.placeholder).initialValue("").targetEvent(t.$event).ok(p3xr.strings.intention.license).cancel(p3xr.strings.intention.cancel),s=await o.show(i),a=await r.request({action:"set-license",payload:{license:s}});n.g.p3xr.isBot()||a.donated===p3xr.state.donated||window.gtag("config",p3xr.settings.googleAnalytics,{page_path:a.donated?"/donated":"/free"}),p3xr.state.donated=a.donated,e.toast({message:"ok"!==a.info?p3xr.strings.error[a.info]:p3xr.strings.status.licenseSaved})}catch(t){if(void 0===t)return;p3xr.strings.error[t.message]&&(t=new Error(p3xr.strings.error[t.message])),e.generalHandleError(t)}},this.openTreeSettingDialog=e=>{i.show(e)},this.deleteConnection=async t=>{const{model:n,ev:o}=t;try{await e.confirm({event:o,message:p3xr.strings.confirm.deleteConnectionText});await r.request({action:"connection-delete",payload:{id:n.id}});e.toast({message:p3xr.strings.status.deleted})}catch(t){if(void 0===t)return;e.generalHandleError(t)}}}]})},4370:()=>{p3xr.ng.provider("p3xrTheme",["$mdThemingProvider",function(e){e.generateThemesOnDemand(!0),e.alwaysWatchTheme(!0),e.setNonce();const t="p3xr-theme",n="p3xrThemeLight";this.start=()=>{Object.keys(p3xr.theme).forEach((t=>{p3xr.theme[t](e)})),e.setDefaultTheme(n)};const o={},r={dark:["p3xrThemeDarkNeu","p3xrThemeDark","p3xrThemeDarkoBluo","p3xrThemeMatrix"],light:["p3xrThemeLight","p3xrThemeEnterprise","p3xrThemeRedis"]};this.$get=["$mdTheming","$rootScope","$cookies","$mdColors",function(i,s,a,d){return new function(){const l=this;this.isDark=()=>r.dark.includes(this.getCurrentThemeName()),this.start=()=>{l.setTheme()},this.setTheme=l=>{void 0===l&&void 0===(l=a.get(t))&&(l=n),o.hasOwnProperty(l)||(i.generateTheme(l),i.generateTheme(l+"Layout"),i.generateTheme(l+"Common"),o[l]=!0),e.setDefaultTheme(l),s.p3xr.state.theme=l,a.put(t,l,{expires:p3xr.settings.cookieExpiry}),$body.removeClass("p3xr-theme-light"),$body.removeClass("p3xr-theme-dark"),r.dark.includes(l)?$body.addClass("p3xr-theme-dark"):$body.addClass("p3xr-theme-light"),$("#p3xr-theme-styles").remove();const c=p3xr.state.themeCommon+"-background";let m="";"p3xrThemeMatrix"==l&&(m="\n");const p=d.getThemeColor(p3xr.state.themeLayout+"-primary-hue-1"),u=`\n${m}\n\n.p3xr-theme-dark .p3xr-content-border {\n    border-left: 1px solid ${p};\n    border-right: 1px solid ${p};\n    border-bottom: 1px solid ${p};\n}\n\n.p3xr-theme-light .p3xr-content-border {\n    border-left: 1px solid transparent;\n    border-right: 1px solid transparent;\n    border-bottom: 1px solid transparent;\n}\n\n\n.p3xr-toast-default .md-toast-content {\n    background-color: ${this.isDark()?d.getThemeColor(c):"auto"} !important;\n    border: solid 1px ${this.isDark()?"rgba(255, 255, 255, 0.5)":"auto"} !important;\n    ${this.isDark()?"box-shadow:  0 0 10px  rgba(0,0,0,0.6);":""}\n}\n\ntreecontrol i.tree-branch-head:before {\n    color: ${this.isDark()?d.getThemeColor("amber-A100"):d.getThemeColor("amber-A400")};\n    ${this.isDark()?"text-shadow: 1px 1px 1px rgba(55, 29, 27, 0.5);":"text-shadow: 1px 1px 0px rgba(55, 11, 0, 0.5);"}\n}\n\nbody.p3xr-theme-dark[md-theme="p3xrThemeMatrixLayout"] treecontrol i.tree-branch-head:before {\n    color: ${d.getThemeColor("lime-A400")} !important;\n}\n\n\n.p3xr-list-key-odd-item {\n    background-color: ${d.getThemeColor(p3xr.state.themeLayout+"-background-500-0.1")};\n}\n.p3xr-list-key-item {\n    border-bottom: 1px solid ${this.isDark()?d.getThemeColor(p3xr.state.themeLayout+"-background-300-0.1"):d.getThemeColor(p3xr.state.themeLayout+"-background-700-0.1")};\n}\n`;$("head").append('<style id="p3xr-theme-styles">'+u+"</style>"),s.$broadcast("p3xr-theme-switched")},this.getCurrentThemeName=()=>a.get(t),this.generateThemeName=e=>"p3xrTheme"+e[0].toUpperCase()+e.substring(1)}}]}])},3888:()=>{p3xr.theme.darkNeu=function(e,t){p3xr.theme.darkNeu.order=1,e.theme("p3xrThemeDarkNeuLayout").primaryPalette("blue-grey",{default:"800","hue-1":"300","hue-2":"700","hue-3":"900"}).accentPalette("blue-grey",{default:"300"}).warnPalette("grey").backgroundPalette("grey",{default:"900"}).dark(),e.theme("p3xrThemeDarkNeu").primaryPalette("cyan").accentPalette("blue").warnPalette("yellow").dark(),e.theme("p3xrThemeDarkNeuCommon").primaryPalette("green").accentPalette("grey").warnPalette("blue").backgroundPalette("blue-grey",{default:"900"}).dark()}},8404:()=>{p3xr.theme.dark=function(e){p3xr.theme.dark.order=3,e.theme("p3xrThemeDarkLayout").primaryPalette("grey",{default:"800","hue-1":"500","hue-2":"700","hue-3":"900"}).accentPalette("grey").warnPalette("grey").backgroundPalette("grey",{default:"900","hue-1":"800","hue-2":"700","hue-3":"900"}),e.theme("p3xrThemeDarkLayout").dark(),e.theme("p3xrThemeDark").primaryPalette("indigo",{default:"300"}).accentPalette("blue").warnPalette("orange").backgroundPalette("grey"),e.theme("p3xrThemeDark").dark(),e.theme("p3xrThemeDarkCommon").primaryPalette("green").accentPalette("grey").warnPalette("indigo",{default:"200"}).backgroundPalette("grey"),e.theme("p3xrThemeDarkCommon").dark()}},9767:()=>{p3xr.theme.darkoBluo=function(e){p3xr.theme.darkoBluo.order=5,e.theme("p3xrThemeDarkoBluoLayout").primaryPalette("indigo",{default:"900","hue-1":"500","hue-2":"700","hue-3":"900"}).accentPalette("indigo",{default:"600","hue-1":"50","hue-2":"700","hue-3":"900"}).warnPalette("indigo").backgroundPalette("grey",{default:"900","hue-1":"900","hue-2":"500","hue-3":"100"}),e.theme("p3xrThemeDarkoBluoLayout").dark(),e.theme("p3xrThemeDarkoBluo").primaryPalette("indigo",{default:"300","hue-1":"50","hue-2":"700","hue-3":"900"}).accentPalette("blue").warnPalette("orange").backgroundPalette("grey"),e.theme("p3xrThemeDarkoBluo").dark(),e.theme("p3xrThemeDarkoBluoCommon").primaryPalette("green").accentPalette("grey").warnPalette("light-blue").backgroundPalette("indigo",{default:"700"}),e.theme("p3xrThemeDarkoBluoCommon").dark()}},2526:()=>{p3xr.theme.enterprise=function(e,t){p3xr.theme.enterprise.order=2,e.theme("p3xrThemeEnterpriseLayout").primaryPalette("grey",{default:"800","hue-1":"500","hue-2":"700","hue-3":"900"}).accentPalette("grey",{default:"600","hue-1":"50","hue-2":"700","hue-3":"900"}).warnPalette("grey").backgroundPalette("grey",{default:"400"}),e.theme("p3xrThemeEnterprise").primaryPalette("indigo").accentPalette("blue",{default:"700"}).warnPalette("red",{default:"700"}),e.theme("p3xrThemeEnterpriseCommon").primaryPalette("green").accentPalette("grey").warnPalette("light-blue")}},2974:()=>{p3xr.theme.light=function(e,t){return p3xr.theme.light.order=0,e.theme("p3xrThemeLightLayout").primaryPalette("blue-grey",{default:"800","hue-1":"200","hue-2":"700","hue-3":"900"}).accentPalette("blue-grey").warnPalette("grey").backgroundPalette("blue-grey",{default:"A100","hue-1":"50","hue-2":"700","hue-3":"900"}),e.theme("p3xrThemeLight").primaryPalette("deep-purple").accentPalette("purple",{default:"500"}).warnPalette("red",{default:"700"}).backgroundPalette("blue-grey"),e.theme("p3xrThemeLightCommon").primaryPalette("green").accentPalette("grey").warnPalette("blue-grey").backgroundPalette("blue-grey"),this}},6298:()=>{p3xr.theme.matrix=function(e){p3xr.theme.matrix.order=5,e.theme("p3xrThemeMatrixLayout").primaryPalette("light-green",{default:"A400","hue-1":"A400","hue-2":"700","hue-3":"900"}).accentPalette("light-green",{default:"A400","hue-1":"100","hue-2":"600","hue-3":"800"}).warnPalette("green").backgroundPalette("grey",{default:"900","hue-1":"900","hue-2":"500","hue-3":"100"}).dark(),e.theme("p3xrThemeMatrix").primaryPalette("light-green",{default:"A400","hue-1":"50","hue-2":"700","hue-3":"900"}).accentPalette("lime",{default:"A400"}).warnPalette("green",{default:"A700"}).backgroundPalette("grey").dark(),e.theme("p3xrThemeMatrixCommon").primaryPalette("light-green",{default:"A400","hue-1":"A400","hue-2":"A400","hue-3":"A400"}).accentPalette("light-green",{default:"A400","hue-1":"A400","hue-2":"A400","hue-3":"A400"}).warnPalette("green").backgroundPalette("grey",{default:"900"}).dark()}},8498:()=>{p3xr.theme.redis=function(e,t){p3xr.theme.redis.order=4,e.theme("p3xrThemeRedisLayout").primaryPalette("red",{default:"800","hue-1":"200","hue-2":"700","hue-3":"900"}).accentPalette("red",{default:"200"}).warnPalette("red").backgroundPalette("red",{default:"900","hue-1":"600","hue-2":"200","hue-3":"200"}),e.theme("p3xrThemeRedis").primaryPalette("grey",{default:"900"}).accentPalette("grey",{default:"600"}).warnPalette("amber"),e.theme("p3xrThemeRedisCommon").primaryPalette("green").accentPalette("grey").warnPalette("red").backgroundPalette("grey")}},3597:e=>{e.exports=(e,t)=>{e.state({name:"settings",url:"/settings",template:"<p3xr-settings></p3xr-settings>"}),e.state({name:"main",url:"/main",template:"<p3xr-main></p3xr-main>"}),e.state({name:"console",url:"/console",template:"<p3xr-console></p3xr-console>"}),e.state("main.statistics",{url:"/statistics",template:"<p3xr-main-statistics></p3xr-main-statistics>",params:{action:null,expandedNodes:null,response:null}}),e.state("main.key",{url:"/key/:key",template:"<p3xr-main-key></p3xr-main-key>",params:{resize:null}}),e.state("socketio-error",{url:"/socketio-error",template:"<p3xr-error></p3xr-error>",params:{error:null}})}},9606:(e,t,n)=>{let o=0;p3xr.ng.component("p3xrAccordion",{template:n(2862),bindings:{p3xrTitle:"<",p3xrAccordionKey:"@"},transclude:{actions:"?p3xrAccordionActions",content:"p3xrAccordionContent"},controller:["$transclude","$cookies",function(e,t){this.transcludePresent=function(t){return e.isSlotFilled(t)},this.$onInit=function(){void 0!==this.p3xrAccordionKey&&""!==this.p3xrAccordionKey||(this.p3xAccordionKey=++o);const e="p3xr-accordion-extended-"+this.p3xrAccordionKey;Object.defineProperty(this,"extended",{get:()=>{const n=t.get(e);return void 0===n||"true"===n},set:n=>{t.put(e,String(n),{expires:p3xr.settings.cookieExpiry})}})}}]})},7713:(e,t,n)=>{p3xr.ng.component("p3xrButton",{template:n(9670),bindings:{p3xrLabel:"<",p3xrMdIcon:"@",p3xrFaIcon:"@",p3xrTooltipDirection:"@",p3xrClasses:"@"}})},57:()=>{p3xr.ng.directive("p3xrInput",["p3xrTheme",function(e){return{template:'<input ng-focus="focused=true" ng-blur="focused=false" class="p3xr-input" md-theme="{{ $root.p3xr.state.themeLayout }}" md-colors="{\'border-color\': inputBorderColor()}" ng-style="{ \'background\': inputBackground(), \'color\': inputColor()}"/>',replace:!0,link:function(t){t.focused=!1,t.inputBackground=()=>e.isDark()?"rgba(64, 64, 64, 1)":"white",t.inputBorderColor=()=>(e.isDark(),"primary-hue-1"),t.inputColor=()=>e.isDark()?"white":"black"}}}])},8820:(e,t,n)=>{n.g.p3xr.api={host:void 0};const o=new URL(location.toString());"8080"===o.port?n.g.p3xr.api.host="http://localhost:7843":n.g.p3xr.api.host=`${o.protocol}//${o.host}`},6566:(e,t,n)=>{n.g.p3xr.clipboard=e=>{var t=$("<textarea>"+e.value+"</textarea>");$("body").append(t),t.select();var n=!1;try{n=document.execCommand("copy")}catch(e){}return t.remove(),n}},7293:()=>{const e={getPosition:function(e){let t=0,n=0;if(void 0===e)return{left:0,top:0,width:0,height:0};const o=e.currentStyle||window.getComputedStyle(e),r={width:e.offsetWidth+(parseFloat(o.marginLeft)+parseFloat(o.marginRight))+(parseFloat(o.paddingLeft)+parseFloat(o.paddingRight))+(parseFloat(o.borderLeftWidth)+parseFloat(o.borderRightWidth)),height:e.offsetHeight+(parseFloat(o.marginTop)+parseFloat(o.marginBottom))+(parseFloat(o.paddingTop)+parseFloat(o.paddingBottom))+(parseFloat(o.borderTopWidth)+parseFloat(o.borderBottomWidth))};for(;e;){if("BODY"===e.tagName){const o=e.scrollLeft||document.documentElement.scrollLeft,r=e.scrollTop||document.documentElement.scrollTop;t+=e.offsetLeft-o+e.clientLeft,n+=e.offsetTop-r+e.clientTop}else t+=e.offsetLeft-e.scrollLeft+e.clientLeft,n+=e.offsetTop-e.scrollTop+e.clientTop;e=e.offsetParent}return r.left=t,r.top=n,r}};p3xr.dom=e},7943:(e,t,n)=>{const o=new RegExp("spider|bot|yahoo|bing|google|yandex|lynx|curl|embedly|quora|outbrain|pinterest|vkShare|W3C_Validator|crawl|borg|slurp|archiver|netresearch|lycos|scooter|altavista|teoma|oegp|charlotte|http client|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|semanticdiscovery|snappy|speedy|voila|vortex|voyager|zao|zeal|dataparksearch|findlinks|browsermob|httpmonitor|bingpreview|pagepeeker|webthumb|url2png|zooshot|gomeza|google sketchup|read later|pingdom|facebook|rackspace|scan|link|ezine|preview|dig|tarantula|urllib|jakarta|wget|rget|monitor|libwww|moozilla|seer|spice|snoopy|feedfetcher|wordpress|java|netfront|archive|xenu|feed|appmanager|covario|perl|host|lwp|page speed|ptst|digext|nutch|sleuth|yottaamonitor|bubing|corifeus","i");n.g.p3xr.isBot=()=>o.test(navigator.userAgent)},4117:(e,t,n)=>{let o=0,r=Date.now();n.g.p3xr.nextId=()=>{const e=Date.now();r!==e&&(o=0,r=e);const t=++o,i=n.g.p3xr.random().reverse().padStart(15,"0");return`P3Xid${r.toString(16).padStart(12,"0").reverse()}${t.toString(16).padStart(3,"0").reverse()}${i}`}},554:e=>{const t=e=>{const{node:n,status:o,nodeCallback:r}=e;n.$inview=o,r&&r({node:n});for(let n of e.node.children)n.$inview=o,r&&r({node:n}),n.children.length>0&&t({node:n,status:e.status,nodeCallback:r})};e.exports.recursive=e=>{let{status:n,nodes:o,nodeCallback:r}=e;void 0===n&&(n=!1),Array.isArray(o)||(o=[o]);for(let e of o)t({node:e,status:n,nodeCallback:r})}},6399:(e,t,n)=>{n.g.p3xr.random=()=>(Math.floor(9e16*Math.random())+1e16).toString(16)},4380:()=>{const e=new Date;e.setFullYear(e.getFullYear()+5),p3xr.settings={maxLightKeysCount:11e4,resizeMinWidth:320,socket:{timeout:3e5},toast:{timeout:5e3,position:"bottom right"},debounce:250,debounceSearch:2e3,cookieExpiry:e,connection:{cookieNameCurrentDatabase:"p3xr-main-current-database",getCookieNameCurrentDatabase:e=>p3xr.settings.connection.cookieNameCurrentDatabase+"-"+e},tree:{cookieName:"p3xr-main-treecontrol-divider",defaultDivider:":"},redisTreeDivider:":",animation:0,animationSettings:{default:0,cookieName:"p3xr-animation-settings"},jsonFormat:4,googleAnalytics:"UA-169625044-1",jsonFormatSettings:{default:4,cookieName:"p3xr-json-format"},paging:{default:250,cookieName:"p3xr-main-treecontrol-page-size"},language:{defaultLanguage:"en",current:void 0,cookieName:"p3xr-language",translation:{}},pageCount:50,maxValueDisplay:1024,maxValueDisplaySetting:{default:1024,cookieName:"p3xr-main-treecontrol-max-value-display"},maxKeys:1e3,maxKeysSettings:{default:1e3,max:1e5,cookieName:"p3xr-max-keys"},keySortInfo:{default:!0,cookieName:"p3xr-main-treecontrol-key-sort"},keysSort:!0,searchClientSide:!1,searchInfoClientSide:{default:!1,cookieName:"p3xr-main-treecontrol-search-client-mode"},searchStartsWith:!1,searchInfoStartsWith:{default:!1,cookieName:"p3xr-main-treecontrol-search-starts-with"},connectInfo:{cookieName:"p3xr-layout-connect"}}},8308:()=>{p3xr.sort={naturalCompareDocument:()=>(e,t)=>{const n=/(\d+)|(\D+)/g,o=[],r=[];for(e.replace(n,(function(e,t,n){o.push([t||1/0,n||""])})),t.replace(n,(function(e,t,n){r.push([t||1/0,n||""])}));o.length&&r.length;){const e=o.shift(),t=r.shift(),n=parseFloat(e[0])-parseFloat(t[0])||e[1].localeCompare(t[1]);if(n)return n}return o.length-r.length}}},9567:()=>{p3xr.state={treeDividers:[],donated:!1,theme:void 0,connection:void 0,currentDatabase:void 0,redisChanged:!1,databaseIndexes:[0],connections:[],redisConnections:{},keys:[],cfg:void 0,version:void 0,keysInfo:void 0,failed:!1,keysRaw:[],search:"",commands:[],reducedFunctions:!1,dbsize:void 0,monitor:!1},Object.defineProperty(p3xr.state,"themeLayout",{get:()=>p3xr.state.theme+"Layout"}),Object.defineProperty(p3xr.state,"themeCommon",{get:()=>p3xr.state.theme+"Common"}),p3xr.connectionsReset=()=>{p3xr.state.connections={list:[]}},p3xr.connectionsReset()},3581:(e,t,n)=>{p3xr.translations={en:n(3555)},p3xr.strings=p3xr.translations.en},5498:()=>{String.prototype.reverse||(String.prototype.reverse=function(){return this.split("").reverse().join("")})},7804:()=>{p3xr.ui.overlay=new function(){this.show=(e={})=>{this.hide(),$body.append(((e={})=>`\n<div id="p3xr-overlay">\n    <div id="p3xr-overlay-info">\n        <i class="fas fa-cog fa-spin fa-4x"></i>\n        ${e.hasOwnProperty("message")?"<br/><br/>":""}\n        ${e.hasOwnProperty("message")?e.message:""}\n    </div>\n</div>\n        \n        `)(e))},this.hide=()=>{$body.find("#p3xr-overlay").remove()}}},3555:e=>{const t={error:{cleared_license:"Cleared license",invalid_license:"Invalid license",server_error:"Server error, please try again"},title:{donate:"Donate",jsonRecursive:"Expanding all leafs",name:"P3X Redis UI",nameDonated:"P3X Redis UI+",main:"You may choose a Redis connection to connect from the left bottom menu.",statistics:"Statistics",error:"Error",connectingRedis:"Connecting to Redis ...",socketioConnectError:"Socket.IO Error",db:"DB",server:"Server",clients:"Clients",memory:"Memory",persistence:"Persistance",stats:"Statistics",replication:"Replication",cpu:"CPU",cluster:"Cluster"},confirm:{title:"Confirm",alert:"Alert",info:"Info",deleteListItem:"Are you sure to delete this list item?",deleteHashKey:"Are you sure to delete this hash key item?",deleteSetMember:"Are you sure to delete this set member?",deleteZSetMember:"Are you sure to delete this sorted set member?",deleteConnection:"Confirm",deleteConnectionText:"Are you sure to delete this Redis connection?",deleteNode:"Are you sure to delete this Redis node?",deleteAllKeys:e=>`Delete this tree and all it's keys (${e.key})?`,socketioConnectError:"Socket.IO cannot connect to the server, you can reload and you might to resolve the connection error by yourself, the client does not know to solve it by itself.",deleteKey:"Are you sure to delete this key?",rename:{title:"Are you sure to rename this key?",textContent:"If you click the rename button, it will rename this key forever.",placeholder:"The Redis key (required)"},ttl:{title:"Are you to change this keys's TTL?",textContent:"If you click the change TTL button, it will rename this key's time to live, empty will persist this key keep forever.",placeholder:"The Redis key's TTL (integer or empty)",placeholderPlaceholder:"Empty means it persists forever, otherwise the used integer.",convertTextToTime:"Convert text to time",convertTextToTimePlaceholder:"Eg. 1d will be 86400"},license:{title:"Enable donated license?",textContent:"If you want to use the donated functions, please contact alabard@gmail.com to request a license. The donation is $1/month.",placeholder:"License key"}},language:{en:"English",zn:"Chinese / 中文"},intention:{copy:"Copy",saveWithFormatJson:"Save with format",formatJson:"Format Json",pubsubMonitor:"PubSub Monitor",language:"Language",ok:"OK",addKey:"Add to this key",addKeyRoot:"Add a root key",reloadKey:"Reload key",reload:"Reload",close:"Close",commands:"Commands",view:"View",statistics:"Statistics",refresh:"Refresh",clear:"Clear",rename:"Rename",main:"Home",cancel:"Cancel",theme:"Theme",github:"GitHub",githubRepo:"Repository",githubRelease:"Releases",githubChangelog:"Change log",settings:"Settings",connect:"Connect",disconnect:"Disconnect",overview:"Overview",console:"Console",noConnections:"No connections, add a connection in the settings menu.",noConnectionsInSettings:"No connections, you may add a NEW CONNECTION above.",connectionAdd:"New connection",extend:"Extend",collapse:"Collapse",add:"Add",edit:"Edit",save:"Save",ttl:"Set TTL",license:"Set license",delete:"Delete",remove:"Remove",sure:"Sure",testConnection:"Test connection",getKey:"Loading Redis key and associated data ...",jsonViewShow:"Display JSON",jsonViewEditor:"Edit JSON"},label:{unableToLoadKey:({key:e})=>`Unable to load this key: ${e}. The exact error is in the console.`,bigJson:"This JSON object is over 10 kb, so make sure you know what you doing, because some functions can be slow rendering.",addNode:"Add node",validateJson:"Validate JSON",reducedFunction:"Reduced functionality",tooManyKeys:e=>`For the full maximum functions allowed keys total is ${e.maxLightKeysCount} count. This database has over the allowed keys in total ${e.count}. The key sorting and the additional fancy tree information is disabled. The searching is happening only on the server instead the client search.`,redisCommandNotFound:"No Redis command match found ...",treeKeyStore:"The sorting (natural compare) is executed on the client aka the browser, which means it has a penalty for big large sets, like over 10k keys, it might add a little time to the page rendering. There is no key sorting in Redis, only like this.",socketIoTimeout:e=>`The Socket.IO timed out for this request (max ${e.timeout/1e3} seconds) ...`,resizerInfo:e=>`Left or right panel minimum width is ${e.width}px`,jsonViewNotParsable:"This value is not JSON parsable  ",ttlTitle:"Set the TTL in seconds",passwordSecure:"The password might will be empty, but still it will show characters, this is a security feature.",treeSeparatorEmpty:"If the tree separator is empty, the tree wil have no nested nodes, just a pure list",treeSeparatorEmptyNote:"No nested nodes, just a pure list",welcomeConsole:"Welcome to the Redis Console",welcomeConsoleInfo:"TAB or SHIFT + TAB completion like bash is enabled",welcomeConsoleInfo2:"Cursor UP or DOWN history is enabled",redisListIndexInfo:"Empty to append, -1 to prepend or save it to the position shown.",console:"Console",connectiondAdd:"Add connection",connectiondEdit:"Edit connection",connectiondView:"View connection",connections:"Connections",keysSort:{on:"Key sorting on",off:"Key sorting off"},awsElastiCache:{on:"AWS ElastiCache / Gcloud memorystore on",off:"AWS ElastiCache / Gcloud memorystore off"},azure:{on:"Azure Redis on",off:"Azure Redis off"},cluster:{on:"Cluster on",off:"Cluster off"},readonly:{on:"Readonly on",off:"Readonly off"},theme:{light:"Light",dark:"Dark enterprise",darkNeu:"Dark",darkoBluo:"Darko bluo",enterprise:"Enterprise",redis:"Redis",matrix:"Matrix"},connected:e=>"Connected: "+e.name,tree:"Tree"},status:{dataCopied:"The data is in the clipboard",licenseSaved:"License saved",nodeRemoved:"Node removed",keyIsNotExisting:"This key could have been deleted or expired.",keyCount:e=>0===e.keyCount?"No key":1===e.keyCount?"1 key":e.keyCount+" keys",treeExpandAll:"Expand all tree leafs, this has a cost, might take time ...",noRedisKeys:"There are no keys in this database.",redisConnected:"Redis connected successful",reloadingDataInfo:"Reloading Redis data info",added:"Added",saved:"Updated",cancelled:"Cancelled",deleted:"Deleted",savedRedis:"Redis data is saved",redisDisconnected:e=>"The current connection had an error: "+e.error.message,dbChanged:e=>`The db index set to ${e.db}. `,treeDeleted:e=>`The tree key was deleted (${e.key}).`,deletedKey:e=>`The key was deleted (${e.key}).`,renamedKey:"This key has been renamed",ttlChanged:"This key's TTL has been changed",notInteger:"This input is not an integer",persisted:"This key is persisted forever",set:"The key is set/added"},code:{"delete-connection":"This connection was deleted, so you are disconnected to this Redis instance.","save-connection":"This connection was changed, so you are disconnected to this Redis instance. You may re-connect.","readonly-connections":"Connections add/save/delete are readonly only!","readonly-connection-mode":"This connection is read only mode!","list-out-of-bounds":"This list index is out of bounds","donation-ware-feature":"This feature is present in the donation version."},form:{error:{required:"Required",port:"The port is between 1-65535",invalid:"The form is invalid"},connection:{label:{name:"Name",host:"Hostname",port:"Port",password:"Password"}},treeSettings:{maxValueDisplay:"Max value display string length",maxValueDisplayInfo:"If max value display zero, it shows everything, if it is bigger than 0, it will truncate. If it is -1, it will not show the value without edit for strings, for others, it display everything.",maxKeys:"The max key count",maxKeysInfo:"So that the GUI does not crash, we limit the max key count.",keyCount:()=>"Number of keys: "+p3xr.state.keysRaw.length,label:{animation:"Use animation",noAnimation:"No animation",jsonFormatTwoSpace:"Format JSON with 2 spaces",jsonFormatFourSpace:"Format JSON with 4 spaces",formName:"Redis settings",searchModeClient:"Client search mode",searchModeServer:"Server search mode",searchModeStartsWith:"Search with starts with mode",searchModeIncludes:"Search includes mode"},field:{treeSeparator:"Tree separator",treeSeparatorSelector:"Tree separator selector",page:"Paging count",keysSort:"Sort the keys",searchMode:"Search mode",searchModeStartsWith:"Search starts with / includes"},error:{page:"The page count must be an integer between 10 - 1000",maxValueDisplay:"The maximum display value must be an integer between -1 and 32768",maxKeys:"The maximum key count value must be an integer between 100 and 100000"}},key:{label:{formName:{add:"Add new Redis key",edit:"Edit Redis key",append:"Add to existing Redis key"}},field:{key:"Key",type:"Type",index:"Index",hashKey:"Hash key",score:"Score",value:"Value"},error:{key:"The key is, at least, one character",hashKey:"The hash table key is at least one character",score:"The sorted set score is required",value:"The value is required"}},main:{label:{database:"DB"}}},page:{overview:{noConnected:"There is no connection to Redis.",overviewClients:"List the connected by the count of clients",connectedCount:e=>1===e.length?"1 client":e.length+" clients"},key:{label:{key:"Key",encoding:"Encoding",length:"Size",ttl:"TTL",ttlTitle:"Time To Live",type:"Type",ttlNotExpire:"does not expire",lengthString:"characters",lengthItem:"items",actions:"Actions"},list:{table:{index:"Index",value:"Value"}},hash:{table:{hashkey:"Hashkey",value:"Value"}},set:{table:{value:"Member"}},zset:{table:{value:"Member",score:"Score"}}},treeControls:{settings:"Tree settings",expandAll:"Expand all",collapseAll:"Collapse all",search:{search:"Search in the keys",clear:"Clear current search to set empty",placeholderClient:"Search client side",placeholderServer:"Search server side",info:`The client side search means, that it matches the text in the search input. The server side search means, that is it like search in the keys patterns as *{search-text}*. For large search sets, it is better to use server side searching. For smaller search sets, it is better to use client side search mode. If the keys count is over ${p3xr.settings.maxLightKeysCount}, you can only search on server side.`,largeSetInfo:"In a large set, client side searching is disabled. so right now only server side searching is possible.",infoDetails:"To find out how the search works, please check out the settings"},pager:{next:"Next",prev:"Previous",first:"First",last:"Last"}}},time:{years:"years",months:"months",days:"days",year:"year",month:"month",day:"day"},redisTypes:{string:"String",list:"List",hash:"Hash table",set:"Set",zset:"Sorted set - zset"}};e.exports=t},7885:e=>{const t={error:{cleared_license:"清除许可证",invalid_license:"无效的许可证",server_error:"服务器错误,请重试"},title:{donate:"捐赠",jsonRecursive:"展开所有叶子",name:"P3X Redis UI",nameDonated:"P3X Redis UI+",main:"您可以从左下方菜单中选择要连接的Redis进行连接访问",statistics:"Statistics",error:"错误",connectingRedis:"连接到Redis ...",socketioConnectError:"Socket.IO 错误",db:"DB",server:"服务端",clients:"客户端",memory:"内存",persistence:"持久性",stats:"统计",replication:"同步复制",cpu:"CPU",cluster:"集群"},confirm:{title:"确认",alert:"警告",info:"信息",deleteListItem:"您确定要删除该列表项吗?",deleteHashKey:"您确定要删除该哈希键项吗?",deleteSetMember:"您确定要删除该集合成员?",deleteZSetMember:"您确定要删除该有序集合成员?",deleteConnection:"确认",deleteConnectionText:"您确定要删除此Redis连接吗?",deleteNode:"您确定要删除此Redis节点吗?",deleteAllKeys:e=>`删除此树及其所有键 (${e.key})?`,socketioConnectError:"Socket.IO 不能连接到该服务, 您可以重新加载及尝试自己解决该错误, 客户端自身无法解决该错误",deleteKey:"您确定要删除这个键吗?",rename:{title:"您确定要重命名该键名么?",textContent:"如果您点击重命名按钮,它将永久重命名此键。",placeholder:"该Redis键(必须存在)"},ttl:{title:"您要改变该键的TTL吗?",textContent:"如果您点击更改TTL按钮, 会改变该键的生存时间,设置为空则有效期永久",placeholder:"Redis键的TTL(整数或空)",placeholderPlaceholder:"空意味着它将永久存在,否则将使用所使用的整数。",convertTextToTime:"将文字转换为时间",convertTextToTimePlaceholder:"例如。 1d将是86400"},license:{title:"启用捐赠的许可证?",textContent:"如果要使用捐赠的功能,请联系alabard@gmail.com申请许可证。 捐款是每月1美元。",placeholder:"注册码"}},language:{en:"英语 / English",zn:"中文 / Chinese"},intention:{copy:"复制",saveWithFormatJson:"保存格式",formatJson:"格式化Json",pubsubMonitor:"PubSub监视器",language:"语言 / Language",ok:"确定",addKey:"加入此键",addKeyRoot:"加入一个根键",reloadKey:"重载键",reload:"重载",close:"关闭",commands:"命令",view:"视图",statistics:"统计",refresh:"刷新",clear:"清除",rename:"重命名",main:"主页",cancel:"取消",theme:"主题",github:"GitHub",githubRepo:"仓库",githubRelease:"发布",githubChangelog:"更新日志",settings:"设置",connect:"连接",disconnect:"断开",overview:"概览",console:"控制台",noConnections:"没有任何连接,请在设置菜单中添加一个连接。",noConnectionsInSettings:"没有连接,您可以在上面添加一个新的连接。",connectionAdd:"新连接",extend:"拓展",collapse:"折叠",add:"添加",edit:"编辑",save:"保存",ttl:"设置 TTL",license:"设定牌照",delete:"删除",remove:"删除",sure:"确定",testConnection:"测试连接",getKey:"加载Redis键及相关数据...",jsonViewShow:"显示 JSON 树",jsonViewEditor:"编辑JSON"},label:{unableToLoadKey:({key:e})=>`无法加载此密钥:: ${e}。确切的错误在控制台中。`,bigJson:"此JSON对象超过10 kb,因此请确保您知道自己在做什么,因为某些功能可能会缓慢呈现。",addNode:"添加节点",validateJson:"验证JSON",reducedFunction:"功能限制",tooManyKeys:e=>`对于最大函数允许的键个数为 ${e.maxLightKeysCount}. 该数据库允许共超过的键总数为 ${e.count}.但键的排序及范式树等相关信息会被禁用。搜索仅在服务器上进行,而不是客户端搜索。`,redisCommandNotFound:"找不到匹配的Redis命令...",treeKeyStore:"该排序(自然排序)运行在客户端的浏览器上, 意味着针对大型集合(例如超过1W个键),渲染的时长开销需要增加.Redis中没有键排序, 就像这样。",socketIoTimeout:e=>`Socket.IO 请求超时,请求时最长(最大 ${e.timeout/1e3}秒) ...`,resizerInfo:e=>`面板(左/右)的最小宽度是 ${e.width}像素`,jsonViewNotParsable:"该值JSON无法解析",ttlTitle:"设置TTL时间(秒)",passwordSecure:"密码可能为空,但仍会显示字符,这是一项安全功能。",treeSeparatorEmpty:"如果树分隔符为空,则树将没有嵌套节点,只有纯列表",treeSeparatorEmptyNote:"没有嵌套节点,只是一个纯列表",welcomeConsole:"欢迎来到Redis控制台",welcomeConsoleInfo:"启用类似Bash命令补全功能,按TAB 或 SHIFT + TAB 补全",welcomeConsoleInfo2:"上下方向键选择历史记录功能已启用",redisListIndexInfo:"空值追加, -1 到前置或保存到光标之处",console:"控制台",connectiondAdd:"添加连接",connectiondEdit:"编辑连接",connectiondView:"查看连接",connections:"连接",keysSort:{on:"开启键排序",off:"关闭键排序"},awsElastiCache:{on:"AWS ElastiCache / Gcloud memorystore on",off:"AWS ElastiCache / Gcloud memorystore off"},azure:{on:"Azure Redis on",off:"Azure Redis off"},cluster:{on:"群集",off:"集群关闭"},readonly:{on:"只读",off:"只读关闭"},theme:{light:"浅棕",dark:"黑暗企业",darkNeu:"暗色",darkoBluo:"蓝色",enterprise:"企业风",redis:"Redis风格",matrix:"矩阵"},connected:e=>"已连接: "+e.name,tree:"树"},status:{dataCopied:"数据在剪贴板中",licenseSaved:"许可证已保存",nodeRemoved:"节点已删除",keyIsNotExisting:"此键可能已被删除或过期。",keyCount:e=>0===e.keyCount?"没有任何键":1===e.keyCount?"1 个键":e.keyCount+" 键",treeExpandAll:"展开所有树,该操作的代价就是有点费时...",noRedisKeys:"此数据库中没有任何键。",redisConnected:"Redis 连接成功",reloadingDataInfo:"重新加载Redis数据信息",added:"已添加",saved:"已更新",cancelled:"已取消",deleted:"已删除",savedRedis:"Redis数据已保存",redisDisconnected:e=>"该连接有一个错误: "+e.error.message,dbChanged:e=>`db索引设置为 ${e.db}. `,treeDeleted:e=>`该树已删除 (${e.key}).`,deletedKey:e=>`该键已删除 (${e.key}).`,renamedKey:"该键已重命名",ttlChanged:"该键TTL已被更改",notInteger:"输入值不是一个整数",persisted:"永久键",set:"键已设置/添加"},code:{"delete-connection":"此连接已删除,因此您与此Redis实例断开连接。","save-connection":"此连接已更改,因此您与此Redis实例断开连接。 你可以重新连接。","readonly-connections":"连接(添加/保存/删除)只是只读!","readonly-connection-mode":"此连接为只读模式!","list-out-of-bounds":"此列表索引超出范围","donation-ware-feature":"捐赠版本中提供了此功能。"},form:{error:{required:"必填",port:"端口号范围是 1-65535",invalid:"值无效,请重新输入"},connection:{label:{name:"连接名字",host:"主机名",port:"端口",password:"密码"}},treeSettings:{maxValueDisplay:"最大值显示字符串长度",maxValueDisplayInfo:"如果最大值显示为零,则显示所有内容,如果大于0,则将截断。 如果它是-1,它将不显示没有编辑字符串的值,对于其他人,它显示所有内容。",maxKeys:"最大密钥数",maxKeysInfo:"为了避免GUI崩溃,我们限制了最大密钥数。",keyCount:()=>"键数: "+p3xr.state.keysRaw.length,label:{animation:"使用动画",noAnimation:"没有动画",jsonFormatTwoSpace:"用2个空格格式化JSON",jsonFormatFourSpace:"用4个空格格式化JSON",formName:"Redis设置",searchModeClient:"客户端搜索模式",searchModeServer:"服务端搜索模式",searchModeStartsWith:"以模式启动搜索",searchModeIncludes:"搜索包括模式"},field:{treeSeparator:"树分隔符",treeSeparatorSelector:"树分隔符选择器",page:"分页数",keysSort:"对键进行排序",searchMode:"搜索模式",searchModeStartsWith:"搜索以 / 开头"},error:{page:"页数必须是10  -  500之间的整数",maxValueDisplay:"最大显示值必须是介于-1和32768之间的整数",maxKeys:"最大密钥计数值必须是100到100000之间的整数"}},key:{label:{formName:{add:"添加新的Redis键",edit:"编辑 Redis key",append:"添加到现有的Redis键"}},field:{key:"键",type:"类型",index:"索引",hashKey:"哈希键",score:"分数",value:"值"},error:{key:"键至少存在一个字符",hashKey:"哈希表键至少是一个字符",score:"排序的集合分数是必需的",value:"该值是必填的"}},main:{label:{database:"DB"}}},page:{overview:{noConnected:"没有任何连接到Redis",overviewClients:"按客户端连接计数展示所有连接",connectedCount:e=>1===e.length?"1 客户端":e.length+" 客户端"},key:{label:{key:"键",encoding:"编码",length:"大小",ttl:"TTL",ttlTitle:"生存时间",type:"类型",ttlNotExpire:"不会过期",lengthString:"字符",lengthItem:"项数",actions:"操作"},list:{table:{index:"索引",value:"值"}},hash:{table:{hashkey:"哈希",value:"值"}},set:{table:{value:"成员"}},zset:{table:{value:"成员",score:"分数"}}},treeControls:{settings:"树设置",expandAll:"展开所有",collapseAll:"折叠所有",search:{search:"在键中搜索",clear:"清空当前搜索结果",placeholderClient:"客户端搜索",placeholderServer:"服务端搜索",info:`客户端搜索是匹配输入的文本,服务端搜索则遵循*{search-text}*模式搜索.对于大量数据的搜索最好在服务端进行搜索,而较小数据量可以考虑客户端搜索。如果键数超过  ${p3xr.settings.maxLightKeysCount}个的则只能在服务端搜索`,largeSetInfo:"在大型集合中,禁用客户端搜索。 所以现在只能进行服务器端搜索。",infoDetails:"要了解搜索的工作原理,请查看设置"},pager:{next:"下一页",prev:"上一页",first:"首页",last:"末页"}}},time:{years:"年份",months:"个月",days:"天",year:"年",month:"月",day:"天"},redisTypes:{string:"字符串",list:"列表",hash:"哈希表",set:"集合",zset:"有序集合 - zset"}};e.exports=t},4848:(e,t,n)=>{var o;!function(){var r={y:function(e){return 1===e?"χρόνος":"χρόνια"},mo:function(e){return 1===e?"μήνας":"μήνες"},w:function(e){return 1===e?"εβδομάδα":"εβδομάδες"},d:function(e){return 1===e?"μέρα":"μέρες"},h:function(e){return 1===e?"ώρα":"ώρες"},m:function(e){return 1===e?"λεπτό":"λεπτά"},s:function(e){return 1===e?"δευτερόλεπτο":"δευτερόλεπτα"},ms:function(e){return 1===e?"χιλιοστό του δευτερολέπτου":"χιλιοστά του δευτερολέπτου"},decimal:","},i={ar:{y:function(e){return 1===e?"سنة":"سنوات"},mo:function(e){return 1===e?"شهر":"أشهر"},w:function(e){return 1===e?"أسبوع":"أسابيع"},d:function(e){return 1===e?"يوم":"أيام"},h:function(e){return 1===e?"ساعة":"ساعات"},m:function(e){return e>2&&e<11?"دقائق":"دقيقة"},s:function(e){return 1===e?"ثانية":"ثواني"},ms:function(e){return 1===e?"جزء من الثانية":"أجزاء من الثانية"},decimal:","},bg:{y:function(e){return["години","година","години"][m(e)]},mo:function(e){return["месеца","месец","месеца"][m(e)]},w:function(e){return["седмици","седмица","седмици"][m(e)]},d:function(e){return["дни","ден","дни"][m(e)]},h:function(e){return["часа","час","часа"][m(e)]},m:function(e){return["минути","минута","минути"][m(e)]},s:function(e){return["секунди","секунда","секунди"][m(e)]},ms:function(e){return["милисекунди","милисекунда","милисекунди"][m(e)]},decimal:","},ca:{y:function(e){return"any"+(1===e?"":"s")},mo:function(e){return"mes"+(1===e?"":"os")},w:function(e){return"setman"+(1===e?"a":"es")},d:function(e){return"di"+(1===e?"a":"es")},h:function(e){return"hor"+(1===e?"a":"es")},m:function(e){return"minut"+(1===e?"":"s")},s:function(e){return"segon"+(1===e?"":"s")},ms:function(e){return"milisegon"+(1===e?"":"s")},decimal:","},cs:{y:function(e){return["rok","roku","roky","let"][p(e)]},mo:function(e){return["měsíc","měsíce","měsíce","měsíců"][p(e)]},w:function(e){return["týden","týdne","týdny","týdnů"][p(e)]},d:function(e){return["den","dne","dny","dní"][p(e)]},h:function(e){return["hodina","hodiny","hodiny","hodin"][p(e)]},m:function(e){return["minuta","minuty","minuty","minut"][p(e)]},s:function(e){return["sekunda","sekundy","sekundy","sekund"][p(e)]},ms:function(e){return["milisekunda","milisekundy","milisekundy","milisekund"][p(e)]},decimal:","},da:{y:"år",mo:function(e){return"måned"+(1===e?"":"er")},w:function(e){return"uge"+(1===e?"":"r")},d:function(e){return"dag"+(1===e?"":"e")},h:function(e){return"time"+(1===e?"":"r")},m:function(e){return"minut"+(1===e?"":"ter")},s:function(e){return"sekund"+(1===e?"":"er")},ms:function(e){return"millisekund"+(1===e?"":"er")},decimal:","},de:{y:function(e){return"Jahr"+(1===e?"":"e")},mo:function(e){return"Monat"+(1===e?"":"e")},w:function(e){return"Woche"+(1===e?"":"n")},d:function(e){return"Tag"+(1===e?"":"e")},h:function(e){return"Stunde"+(1===e?"":"n")},m:function(e){return"Minute"+(1===e?"":"n")},s:function(e){return"Sekunde"+(1===e?"":"n")},ms:function(e){return"Millisekunde"+(1===e?"":"n")},decimal:","},el:r,en:{y:function(e){return"year"+(1===e?"":"s")},mo:function(e){return"month"+(1===e?"":"s")},w:function(e){return"week"+(1===e?"":"s")},d:function(e){return"day"+(1===e?"":"s")},h:function(e){return"hour"+(1===e?"":"s")},m:function(e){return"minute"+(1===e?"":"s")},s:function(e){return"second"+(1===e?"":"s")},ms:function(e){return"millisecond"+(1===e?"":"s")},decimal:"."},es:{y:function(e){return"año"+(1===e?"":"s")},mo:function(e){return"mes"+(1===e?"":"es")},w:function(e){return"semana"+(1===e?"":"s")},d:function(e){return"día"+(1===e?"":"s")},h:function(e){return"hora"+(1===e?"":"s")},m:function(e){return"minuto"+(1===e?"":"s")},s:function(e){return"segundo"+(1===e?"":"s")},ms:function(e){return"milisegundo"+(1===e?"":"s")},decimal:","},et:{y:function(e){return"aasta"+(1===e?"":"t")},mo:function(e){return"kuu"+(1===e?"":"d")},w:function(e){return"nädal"+(1===e?"":"at")},d:function(e){return"päev"+(1===e?"":"a")},h:function(e){return"tund"+(1===e?"":"i")},m:function(e){return"minut"+(1===e?"":"it")},s:function(e){return"sekund"+(1===e?"":"it")},ms:function(e){return"millisekund"+(1===e?"":"it")},decimal:","},fa:{y:"سال",mo:"ماه",w:"هفته",d:"روز",h:"ساعت",m:"دقیقه",s:"ثانیه",ms:"میلی ثانیه",decimal:"."},fi:{y:function(e){return 1===e?"vuosi":"vuotta"},mo:function(e){return 1===e?"kuukausi":"kuukautta"},w:function(e){return"viikko"+(1===e?"":"a")},d:function(e){return"päivä"+(1===e?"":"ä")},h:function(e){return"tunti"+(1===e?"":"a")},m:function(e){return"minuutti"+(1===e?"":"a")},s:function(e){return"sekunti"+(1===e?"":"a")},ms:function(e){return"millisekunti"+(1===e?"":"a")},decimal:","},fo:{y:"ár",mo:function(e){return 1===e?"mánaður":"mánaðir"},w:function(e){return 1===e?"vika":"vikur"},d:function(e){return 1===e?"dagur":"dagar"},h:function(e){return 1===e?"tími":"tímar"},m:function(e){return 1===e?"minuttur":"minuttir"},s:"sekund",ms:"millisekund",decimal:","},fr:{y:function(e){return"an"+(e>=2?"s":"")},mo:"mois",w:function(e){return"semaine"+(e>=2?"s":"")},d:function(e){return"jour"+(e>=2?"s":"")},h:function(e){return"heure"+(e>=2?"s":"")},m:function(e){return"minute"+(e>=2?"s":"")},s:function(e){return"seconde"+(e>=2?"s":"")},ms:function(e){return"milliseconde"+(e>=2?"s":"")},decimal:","},gr:r,he:{y:function(e){return 1===e?"שנה":"שנים"},mo:function(e){return 1===e?"חודש":"חודשים"},w:function(e){return 1===e?"שבוע":"שבועות"},d:function(e){return 1===e?"יום":"ימים"},h:function(e){return 1===e?"שעה":"שעות"},m:function(e){return 1===e?"דקה":"דקות"},s:function(e){return 1===e?"שניה":"שניות"},ms:function(e){return 1===e?"מילישנייה":"מילישניות"},decimal:"."},hr:{y:function(e){return e%10==2||e%10==3||e%10==4?"godine":"godina"},mo:function(e){return 1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci"},w:function(e){return e%10==1&&11!==e?"tjedan":"tjedna"},d:function(e){return 1===e?"dan":"dana"},h:function(e){return 1===e?"sat":2===e||3===e||4===e?"sata":"sati"},m:function(e){var t=e%10;return 2!==t&&3!==t&&4!==t||!(e<10||e>14)?"minuta":"minute"},s:function(e){return 10===e||11===e||12===e||13===e||14===e||16===e||17===e||18===e||19===e||e%10==5?"sekundi":e%10==1?"sekunda":e%10==2||e%10==3||e%10==4?"sekunde":"sekundi"},ms:function(e){return 1===e?"milisekunda":e%10==2||e%10==3||e%10==4?"milisekunde":"milisekundi"},decimal:","},hi:{y:"साल",mo:function(e){return 1===e?"महीना":"महीने"},w:function(e){return 1===e?"हफ़्ता":"हफ्ते"},d:"दिन",h:function(e){return 1===e?"घंटा":"घंटे"},m:"मिनट",s:"सेकंड",ms:"मिलीसेकंड",decimal:"."},hu:{y:"év",mo:"hónap",w:"hét",d:"nap",h:"óra",m:"perc",s:"másodperc",ms:"ezredmásodperc",decimal:","},id:{y:"tahun",mo:"bulan",w:"minggu",d:"hari",h:"jam",m:"menit",s:"detik",ms:"milidetik",decimal:"."},is:{y:"ár",mo:function(e){return"mánuð"+(1===e?"ur":"ir")},w:function(e){return"vik"+(1===e?"a":"ur")},d:function(e){return"dag"+(1===e?"ur":"ar")},h:function(e){return"klukkutím"+(1===e?"i":"ar")},m:function(e){return"mínút"+(1===e?"a":"ur")},s:function(e){return"sekúnd"+(1===e?"a":"ur")},ms:function(e){return"millisekúnd"+(1===e?"a":"ur")},decimal:"."},it:{y:function(e){return"ann"+(1===e?"o":"i")},mo:function(e){return"mes"+(1===e?"e":"i")},w:function(e){return"settiman"+(1===e?"a":"e")},d:function(e){return"giorn"+(1===e?"o":"i")},h:function(e){return"or"+(1===e?"a":"e")},m:function(e){return"minut"+(1===e?"o":"i")},s:function(e){return"second"+(1===e?"o":"i")},ms:function(e){return"millisecond"+(1===e?"o":"i")},decimal:","},ja:{y:"年",mo:"月",w:"週",d:"日",h:"時間",m:"分",s:"秒",ms:"ミリ秒",decimal:"."},ko:{y:"년",mo:"개월",w:"주일",d:"일",h:"시간",m:"분",s:"초",ms:"밀리 초",decimal:"."},lo:{y:"ປີ",mo:"ເດືອນ",w:"ອາທິດ",d:"ມື້",h:"ຊົ່ວໂມງ",m:"ນາທີ",s:"ວິນາທີ",ms:"ມິນລິວິນາທີ",decimal:","},lt:{y:function(e){return e%10==0||e%100>=10&&e%100<=20?"metų":"metai"},mo:function(e){return["mėnuo","mėnesiai","mėnesių"][u(e)]},w:function(e){return["savaitė","savaitės","savaičių"][u(e)]},d:function(e){return["diena","dienos","dienų"][u(e)]},h:function(e){return["valanda","valandos","valandų"][u(e)]},m:function(e){return["minutė","minutės","minučių"][u(e)]},s:function(e){return["sekundė","sekundės","sekundžių"][u(e)]},ms:function(e){return["milisekundė","milisekundės","milisekundžių"][u(e)]},decimal:","},lv:{y:function(e){return g(e)?"gads":"gadi"},mo:function(e){return g(e)?"mēnesis":"mēneši"},w:function(e){return g(e)?"nedēļa":"nedēļas"},d:function(e){return g(e)?"diena":"dienas"},h:function(e){return g(e)?"stunda":"stundas"},m:function(e){return g(e)?"minūte":"minūtes"},s:function(e){return g(e)?"sekunde":"sekundes"},ms:function(e){return g(e)?"milisekunde":"milisekundes"},decimal:","},ms:{y:"tahun",mo:"bulan",w:"minggu",d:"hari",h:"jam",m:"minit",s:"saat",ms:"milisaat",decimal:"."},nl:{y:"jaar",mo:function(e){return 1===e?"maand":"maanden"},w:function(e){return 1===e?"week":"weken"},d:function(e){return 1===e?"dag":"dagen"},h:"uur",m:function(e){return 1===e?"minuut":"minuten"},s:function(e){return 1===e?"seconde":"seconden"},ms:function(e){return 1===e?"milliseconde":"milliseconden"},decimal:","},no:{y:"år",mo:function(e){return"måned"+(1===e?"":"er")},w:function(e){return"uke"+(1===e?"":"r")},d:function(e){return"dag"+(1===e?"":"er")},h:function(e){return"time"+(1===e?"":"r")},m:function(e){return"minutt"+(1===e?"":"er")},s:function(e){return"sekund"+(1===e?"":"er")},ms:function(e){return"millisekund"+(1===e?"":"er")},decimal:","},pl:{y:function(e){return["rok","roku","lata","lat"][c(e)]},mo:function(e){return["miesiąc","miesiąca","miesiące","miesięcy"][c(e)]},w:function(e){return["tydzień","tygodnia","tygodnie","tygodni"][c(e)]},d:function(e){return["dzień","dnia","dni","dni"][c(e)]},h:function(e){return["godzina","godziny","godziny","godzin"][c(e)]},m:function(e){return["minuta","minuty","minuty","minut"][c(e)]},s:function(e){return["sekunda","sekundy","sekundy","sekund"][c(e)]},ms:function(e){return["milisekunda","milisekundy","milisekundy","milisekund"][c(e)]},decimal:","},pt:{y:function(e){return"ano"+(1===e?"":"s")},mo:function(e){return 1===e?"mês":"meses"},w:function(e){return"semana"+(1===e?"":"s")},d:function(e){return"dia"+(1===e?"":"s")},h:function(e){return"hora"+(1===e?"":"s")},m:function(e){return"minuto"+(1===e?"":"s")},s:function(e){return"segundo"+(1===e?"":"s")},ms:function(e){return"milissegundo"+(1===e?"":"s")},decimal:","},ro:{y:function(e){return 1===e?"an":"ani"},mo:function(e){return 1===e?"lună":"luni"},w:function(e){return 1===e?"săptămână":"săptămâni"},d:function(e){return 1===e?"zi":"zile"},h:function(e){return 1===e?"oră":"ore"},m:function(e){return 1===e?"minut":"minute"},s:function(e){return 1===e?"secundă":"secunde"},ms:function(e){return 1===e?"milisecundă":"milisecunde"},decimal:","},ru:{y:function(e){return["лет","год","года"][m(e)]},mo:function(e){return["месяцев","месяц","месяца"][m(e)]},w:function(e){return["недель","неделя","недели"][m(e)]},d:function(e){return["дней","день","дня"][m(e)]},h:function(e){return["часов","час","часа"][m(e)]},m:function(e){return["минут","минута","минуты"][m(e)]},s:function(e){return["секунд","секунда","секунды"][m(e)]},ms:function(e){return["миллисекунд","миллисекунда","миллисекунды"][m(e)]},decimal:","},uk:{y:function(e){return["років","рік","роки"][m(e)]},mo:function(e){return["місяців","місяць","місяці"][m(e)]},w:function(e){return["тижнів","тиждень","тижні"][m(e)]},d:function(e){return["днів","день","дні"][m(e)]},h:function(e){return["годин","година","години"][m(e)]},m:function(e){return["хвилин","хвилина","хвилини"][m(e)]},s:function(e){return["секунд","секунда","секунди"][m(e)]},ms:function(e){return["мілісекунд","мілісекунда","мілісекунди"][m(e)]},decimal:","},ur:{y:"سال",mo:function(e){return 1===e?"مہینہ":"مہینے"},w:function(e){return 1===e?"ہفتہ":"ہفتے"},d:"دن",h:function(e){return 1===e?"گھنٹہ":"گھنٹے"},m:"منٹ",s:"سیکنڈ",ms:"ملی سیکنڈ",decimal:"."},sk:{y:function(e){return["rok","roky","roky","rokov"][p(e)]},mo:function(e){return["mesiac","mesiace","mesiace","mesiacov"][p(e)]},w:function(e){return["týždeň","týždne","týždne","týždňov"][p(e)]},d:function(e){return["deň","dni","dni","dní"][p(e)]},h:function(e){return["hodina","hodiny","hodiny","hodín"][p(e)]},m:function(e){return["minúta","minúty","minúty","minút"][p(e)]},s:function(e){return["sekunda","sekundy","sekundy","sekúnd"][p(e)]},ms:function(e){return["milisekunda","milisekundy","milisekundy","milisekúnd"][p(e)]},decimal:","},sl:{y:function(e){return e%10==1?"leto":e%100==2?"leti":e%100==3||e%100==4||Math.floor(e)!==e&&e%100<=5?"leta":"let"},mo:function(e){return e%10==1?"mesec":e%100==2||Math.floor(e)!==e&&e%100<=5?"meseca":e%10==3||e%10==4?"mesece":"mesecev"},w:function(e){return e%10==1?"teden":e%10==2||Math.floor(e)!==e&&e%100<=4?"tedna":e%10==3||e%10==4?"tedne":void 0},d:function(e){return e%100==1?"dan":"dni"},h:function(e){return e%10==1?"ura":e%100==2?"uri":e%10==3||e%10==4||Math.floor(e)!==e?"ure":"ur"},m:function(e){return e%10==1?"minuta":e%10==2?"minuti":e%10==3||e%10==4||Math.floor(e)!==e&&e%100<=4?"minute":"minut"},s:function(e){return e%10==1?"sekunda":e%100==2?"sekundi":e%100==3||e%100==4||Math.floor(e)!==e?"sekunde":"sekund"},ms:function(e){return e%10==1?"milisekunda":e%100==2?"milisekundi":e%100==3||e%100==4||Math.floor(e)!==e?"milisekunde":"milisekund"},decimal:","},sv:{y:"år",mo:function(e){return"månad"+(1===e?"":"er")},w:function(e){return"veck"+(1===e?"a":"or")},d:function(e){return"dag"+(1===e?"":"ar")},h:function(e){return"timm"+(1===e?"e":"ar")},m:function(e){return"minut"+(1===e?"":"er")},s:function(e){return"sekund"+(1===e?"":"er")},ms:function(e){return"millisekund"+(1===e?"":"er")},decimal:","},sw:{y:function(e){return 1===e?"mwaka":"miaka"},mo:function(e){return 1===e?"mwezi":"miezi"},w:"wiki",d:function(e){return 1===e?"siku":"masiku"},h:function(e){return 1===e?"saa":"masaa"},m:"dakika",s:"sekunde",ms:"milisekunde",decimal:"."},tr:{y:"yıl",mo:"ay",w:"hafta",d:"gün",h:"saat",m:"dakika",s:"saniye",ms:"milisaniye",decimal:","},th:{y:"ปี",mo:"เดือน",w:"อาทิตย์",d:"วัน",h:"ชั่วโมง",m:"นาที",s:"วินาที",ms:"มิลลิวินาที",decimal:"."},vi:{y:"năm",mo:"tháng",w:"tuần",d:"ngày",h:"giờ",m:"phút",s:"giây",ms:"mili giây",decimal:","},zh_CN:{y:"年",mo:"个月",w:"周",d:"天",h:"小时",m:"分钟",s:"秒",ms:"毫秒",decimal:"."},zh_TW:{y:"年",mo:"個月",w:"周",d:"天",h:"小時",m:"分鐘",s:"秒",ms:"毫秒",decimal:"."}};function s(e){var t=function(e,n){return function(e,t){var n,o,r;e=Math.abs(e);var s,a,l,c=function(e){var t=[e.language];if(h(e,"fallbacks")){if(!x(e.fallbacks)||!e.fallbacks.length)throw new Error("fallbacks must be an array with at least one element");t=t.concat(e.fallbacks)}for(var n=0;n<t.length;n++){var o=t[n];if(h(e.languages,o))return e.languages[o];if(h(i,o))return i[o]}throw new Error("No language found.")}(t),m=[];for(n=0,o=t.units.length;n<o;n++){if(s=t.units[n],a=t.unitMeasures[s],n+1===o)if(h(t,"maxDecimalPoints")){var p=Math.pow(10,t.maxDecimalPoints),u=e/a;l=parseFloat((Math.floor(p*u)/p).toFixed(t.maxDecimalPoints))}else l=e/a;else l=Math.floor(e/a);m.push({unitCount:l,unitName:s}),e-=l*a}var g,f,y=0;for(n=0;n<m.length;n++)if(m[n].unitCount){y=n;break}if(t.round)for(n=m.length-1;n>=0&&((r=m[n]).unitCount=Math.round(r.unitCount),0!==n);n--)f=m[n-1],g=t.unitMeasures[f.unitName]/t.unitMeasures[r.unitName],(r.unitCount%g==0||t.largest&&t.largest-1<n-y)&&(f.unitCount+=r.unitCount/g,r.unitCount=0);var v=[];for(n=0,m.length;n<o&&((r=m[n]).unitCount&&v.push(d(r.unitCount,r.unitName,c,t)),v.length!==t.largest);n++);if(!v.length)return d(0,t.units[t.units.length-1],c,t);if(!t.conjunction||1===v.length)return v.join(t.delimiter);if(2===v.length)return v.join(t.conjunction);if(v.length>2)return v.slice(0,-1).join(t.delimiter)+(t.serialComma?",":"")+t.conjunction+v.slice(-1)}(e,l({},t,n||{}))};return l(t,{language:"en",delimiter:", ",spacer:" ",conjunction:"",serialComma:!0,units:["y","mo","w","d","h","m","s"],languages:{},round:!1,unitMeasures:{y:315576e5,mo:26298e5,w:6048e5,d:864e5,h:36e5,m:6e4,s:1e3,ms:1}},e)}var a=s({});function d(e,t,n,o){var r;r=h(o,"decimal")?o.decimal:h(n,"decimal")?n.decimal:".";var i,s=e.toString().replace(".",r),a=n[t];return i="function"==typeof a?a(e):a,s+o.spacer+i}function l(e){for(var t,n=1;n<arguments.length;n++)for(var o in t=arguments[n])h(t,o)&&(e[o]=t[o]);return e}function c(e){return 1===e?0:Math.floor(e)!==e?1:e%10>=2&&e%10<=4&&!(e%100>10&&e%100<20)?2:3}function m(e){return Math.floor(e)!==e?2:e%100>=5&&e%100<=20||e%10>=5&&e%10<=9||e%10==0?0:e%10==1?1:e>1?2:0}function p(e){return 1===e?0:Math.floor(e)!==e?1:e%10>=2&&e%10<=4&&e%100<10?2:3}function u(e){return 1===e||e%10==1&&e%100>20?0:Math.floor(e)!==e||e%10>=2&&e%100>20||e%10>=2&&e%100<10?1:2}function g(e){return e%10==1&&e%100!=11}var x=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};function h(e,t){return Object.prototype.hasOwnProperty.call(e,t)}a.getSupportedLanguages=function(){var e=[];for(var t in i)h(i,t)&&"gr"!==t&&e.push(t);return e},a.humanizer=s,void 0===(o=function(){return a}.call(t,n,t,e))||(e.exports=o)}()},6156:(e,t,n)=>{var o=n(5409).Symbol;e.exports=o},4876:e=>{e.exports=function(e,t){for(var n=-1,o=null==e?0:e.length,r=Array(o);++n<o;)r[n]=t(e[n],n,e);return r}},4663:e=>{e.exports=function(e,t,n,o){var r=-1,i=null==e?0:e.length;for(o&&i&&(n=e[++r]);++r<i;)n=t(n,e[r],r,e);return n}},7112:e=>{e.exports=function(e){return e.split("")}},5718:e=>{var t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;e.exports=function(e){return e.match(t)||[]}},5725:(e,t,n)=>{var o=n(6156),r=n(1398),i=n(3950),s=o?o.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":s&&s in Object(e)?r(e):i(e)}},7435:e=>{e.exports=function(e){return function(t){return null==e?void 0:e[t]}}},2363:e=>{e.exports=function(e,t,n){var o=-1,r=e.length;t<0&&(t=-t>r?0:r+t),(n=n>r?r:n)<0&&(n+=r),r=t>n?0:n-t>>>0,t>>>=0;for(var i=Array(r);++o<r;)i[o]=e[o+t];return i}},127:(e,t,n)=>{var o=n(6156),r=n(4876),i=n(5690),s=n(3494),a=o?o.prototype:void 0,d=a?a.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(i(t))return r(t,e)+"";if(s(t))return d?d.call(t):"";var n=t+"";return"0"==n&&1/t==-Infinity?"-0":n}},2970:(e,t,n)=>{var o=n(2363);e.exports=function(e,t,n){var r=e.length;return n=void 0===n?r:n,!t&&n>=r?e:o(e,t,n)}},9753:(e,t,n)=>{var o=n(2970),r=n(4925),i=n(6345),s=n(3976);e.exports=function(e){return function(t){t=s(t);var n=r(t)?i(t):void 0,a=n?n[0]:t.charAt(0),d=n?o(n,1).join(""):t.slice(1);return a[e]()+d}}},2800:(e,t,n)=>{var o=n(4663),r=n(1182),i=n(2844),s=RegExp("['’]","g");e.exports=function(e){return function(t){return o(i(r(t).replace(s,"")),e,"")}}},5440:(e,t,n)=>{var o=n(7435)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});e.exports=o},5714:(e,t,n)=>{var o="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;e.exports=o},1398:(e,t,n)=>{var o=n(6156),r=Object.prototype,i=r.hasOwnProperty,s=r.toString,a=o?o.toStringTag:void 0;e.exports=function(e){var t=i.call(e,a),n=e[a];try{e[a]=void 0;var o=!0}catch(e){}var r=s.call(e);return o&&(t?e[a]=n:delete e[a]),r}},4925:e=>{var t=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=function(e){return t.test(e)}},8058:e=>{var t=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=function(e){return t.test(e)}},3950:e=>{var t=Object.prototype.toString;e.exports=function(e){return t.call(e)}},5409:(e,t,n)=>{var o=n(5714),r="object"==typeof self&&self&&self.Object===Object&&self,i=o||r||Function("return this")();e.exports=i},6345:(e,t,n)=>{var o=n(7112),r=n(4925),i=n(18);e.exports=function(e){return r(e)?i(e):o(e)}},18:e=>{var t="[\\ud800-\\udfff]",n="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",o="\\ud83c[\\udffb-\\udfff]",r="[^\\ud800-\\udfff]",i="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",a="(?:"+n+"|"+o+")"+"?",d="[\\ufe0e\\ufe0f]?",l=d+a+("(?:\\u200d(?:"+[r,i,s].join("|")+")"+d+a+")*"),c="(?:"+[r+n+"?",n,i,s,t].join("|")+")",m=RegExp(o+"(?="+o+")|"+c+l,"g");e.exports=function(e){return e.match(m)||[]}},4373:e=>{var t="\\u2700-\\u27bf",n="a-z\\xdf-\\xf6\\xf8-\\xff",o="A-Z\\xc0-\\xd6\\xd8-\\xde",r="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",i="["+r+"]",s="\\d+",a="[\\u2700-\\u27bf]",d="["+n+"]",l="[^\\ud800-\\udfff"+r+s+t+n+o+"]",c="(?:\\ud83c[\\udde6-\\uddff]){2}",m="[\\ud800-\\udbff][\\udc00-\\udfff]",p="["+o+"]",u="(?:"+d+"|"+l+")",g="(?:"+p+"|"+l+")",x="(?:['’](?:d|ll|m|re|s|t|ve))?",h="(?:['’](?:D|LL|M|RE|S|T|VE))?",f="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",y="[\\ufe0e\\ufe0f]?",v=y+f+("(?:\\u200d(?:"+["[^\\ud800-\\udfff]",c,m].join("|")+")"+y+f+")*"),b="(?:"+[a,c,m].join("|")+")"+v,$=RegExp([p+"?"+d+"+"+x+"(?="+[i,p,"$"].join("|")+")",g+"+"+h+"(?="+[i,p+u,"$"].join("|")+")",p+"?"+u+"+"+x,p+"+"+h,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",s,b].join("|"),"g");e.exports=function(e){return e.match($)||[]}},268:(e,t,n)=>{var o=n(8683),r=n(2800)((function(e,t,n){return t=t.toLowerCase(),e+(n?o(t):t)}));e.exports=r},8683:(e,t,n)=>{var o=n(3976),r=n(7644);e.exports=function(e){return r(o(e).toLowerCase())}},7280:(e,t,n)=>{var o=n(8383),r=n(1551),i=n(2413),s=Math.max,a=Math.min;e.exports=function(e,t,n){var d,l,c,m,p,u,g=0,x=!1,h=!1,f=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function y(t){var n=d,o=l;return d=l=void 0,g=t,m=e.apply(o,n)}function v(e){return g=e,p=setTimeout($,t),x?y(e):m}function b(e){var n=e-u;return void 0===u||n>=t||n<0||h&&e-g>=c}function $(){var e=r();if(b(e))return k(e);p=setTimeout($,function(e){var n=t-(e-u);return h?a(n,c-(e-g)):n}(e))}function k(e){return p=void 0,f&&d?y(e):(d=l=void 0,m)}function w(){var e=r(),n=b(e);if(d=arguments,l=this,u=e,n){if(void 0===p)return v(u);if(h)return clearTimeout(p),p=setTimeout($,t),y(u)}return void 0===p&&(p=setTimeout($,t)),m}return t=i(t)||0,o(n)&&(x=!!n.leading,c=(h="maxWait"in n)?s(i(n.maxWait)||0,t):c,f="trailing"in n?!!n.trailing:f),w.cancel=function(){void 0!==p&&clearTimeout(p),g=0,d=u=l=p=void 0},w.flush=function(){return void 0===p?m:k(r())},w}},1182:(e,t,n)=>{var o=n(5440),r=n(3976),i=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,s=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");e.exports=function(e){return(e=r(e))&&e.replace(i,o).replace(s,"")}},5690:e=>{var t=Array.isArray;e.exports=t},8383:e=>{e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},6152:e=>{e.exports=function(e){return null!=e&&"object"==typeof e}},3494:(e,t,n)=>{var o=n(5725),r=n(6152);e.exports=function(e){return"symbol"==typeof e||r(e)&&"[object Symbol]"==o(e)}},1551:(e,t,n)=>{var o=n(5409);e.exports=function(){return o.Date.now()}},2413:(e,t,n)=>{var o=n(8383),r=n(3494),i=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,d=/^0o[0-7]+$/i,l=parseInt;e.exports=function(e){if("number"==typeof e)return e;if(r(e))return NaN;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(i,"");var n=a.test(e);return n||d.test(e)?l(e.slice(2),n?2:8):s.test(e)?NaN:+e}},3976:(e,t,n)=>{var o=n(127);e.exports=function(e){return null==e?"":o(e)}},7644:(e,t,n)=>{var o=n(9753)("toUpperCase");e.exports=o},2844:(e,t,n)=>{var o=n(5718),r=n(8058),i=n(3976),s=n(4373);e.exports=function(e,t,n){return e=i(e),void 0===(t=n?void 0:t)?r(e)?s(e):o(e):e.match(t)||[]}},2315:e=>{"use strict";const t=["B","kB","MB","GB","TB","PB","EB","ZB","YB"],n=["B","kiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],o=["b","kbit","Mbit","Gbit","Tbit","Pbit","Ebit","Zbit","Ybit"],r=["b","kibit","Mibit","Gibit","Tibit","Pibit","Eibit","Zibit","Yibit"],i=(e,t)=>{let n=e;return"string"==typeof t?n=e.toLocaleString(t):!0===t&&(n=e.toLocaleString()),n};e.exports=(e,s)=>{if(!Number.isFinite(e))throw new TypeError(`Expected a finite number, got ${typeof e}: ${e}`);const a=(s=Object.assign({bits:!1,binary:!1},s)).bits?s.binary?r:o:s.binary?n:t;if(s.signed&&0===e)return" 0 "+a[0];const d=e<0,l=d?"-":s.signed?"+":"";if(d&&(e=-e),e<1){return l+i(e,s.locale)+" "+a[0]}const c=Math.min(Math.floor(s.binary?Math.log(e)/Math.log(1024):Math.log10(e)/3),a.length-1);e=Number((e/Math.pow(s.binary?1024:1e3,c)).toPrecision(3));return l+i(e,s.locale)+" "+a[c]}},7284:e=>{e.exports=function(e,n,r){r=Object.assign({},t,r||{});let i=0,s=function(e){let t={ms:.001,s:1,m:60,h:3600};return t.d=e.hoursPerDay*t.h,t.w=e.daysPerWeek*t.d,t.mth=e.daysPerYear/e.monthsPerYear*t.d,t.y=e.daysPerYear*t.d,t}(r),a=e.toLowerCase().replace(/[^.\w+-]+/g,"").match(/[-+]?[0-9.]+[a-z]+/g);if(null===a)throw new Error(`The string [${e}] could not be parsed by timestring`);if(a.forEach((e=>{let t=e.match(/[0-9.]+/g)[0],n=e.match(/[a-z]+/g)[0];i+=function(e,t,n){return e*n[o(t)]}(t,n,s)})),n)return function(e,t,n){return e/n[o(t)]}(i,n,s);return i};const t={hoursPerDay:24,daysPerWeek:7,weeksPerMonth:4,monthsPerYear:12,daysPerYear:365.25},n={ms:["ms","milli","millisecond","milliseconds"],s:["s","sec","secs","second","seconds"],m:["m","min","mins","minute","minutes"],h:["h","hr","hrs","hour","hours"],d:["d","day","days"],w:["w","week","weeks"],mth:["mon","mth","mths","month","months"],y:["y","yr","yrs","year","years"]};function o(e){for(let t of Object.keys(n))if(n[t].indexOf(e)>-1)return t;throw new Error(`The unit [${e}] is not supported by timestring`)}}},d={};function l(e){if(d[e])return d[e].exports;var t=d[e]={id:e,loaded:!1,exports:{}};return a[e](t,t.exports,l),t.loaded=!0,t.exports}l.m=a,l.x=e=>{},l.F={},l.E=e=>{Object.keys(l.F).map((t=>{l.F[t](e)}))},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(n,o){if(1&o&&(n=this(n)),8&o)return n;if("object"==typeof n&&n){if(4&o&&n.__esModule)return n;if(16&o&&"function"==typeof n.then)return n}var r=Object.create(null);l.r(r);var i={};e=e||[null,t({}),t([]),t(t)];for(var s=2&o&&n;"object"==typeof s&&!~e.indexOf(s);s=t(s))Object.getOwnPropertyNames(s).forEach((e=>i[e]=()=>n[e]));return i.default=()=>n,l.d(r,i),r},l.d=(e,t)=>{for(var n in t)l.o(t,n)&&!l.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce(((t,n)=>(l.f[n](e,t),t)),[])),l.u=e=>e+"."+{139:"f0f014f45d8508d01936",524:"9f62857976dd1468b5d0"}[e]+".js",l.miniCssF=e=>(179===e?"main":e)+"."+{139:"9e27db9c09a5a661ddf1",524:"31d6cfe0d16ae931b73c"}[e]+".css",l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},o="p3x-redis-ui-material:",l.l=(e,t,r)=>{if(n[e])n[e].push(t);else{var i,s;if(void 0!==r)for(var a=document.getElementsByTagName("script"),d=0;d<a.length;d++){var c=a[d];if(c.getAttribute("src")==e||c.getAttribute("data-webpack")==o+r){i=c;break}}i||(s=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,l.nc&&i.setAttribute("nonce",l.nc),i.setAttribute("data-webpack",o+r),i.src=e),n[e]=[t];var m=(t,o)=>{i.onerror=i.onload=null,clearTimeout(p);var r=n[e];if(delete n[e],i.parentNode&&i.parentNode.removeChild(i),r&&r.forEach((e=>e(o))),t)return t(o)},p=setTimeout(m.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=m.bind(null,i.onerror),i.onload=m.bind(null,i.onload),s&&document.head.appendChild(i)}},l.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),l.p="",r=e=>new Promise(((t,n)=>{var o=l.miniCssF(e),r=l.p+o;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),o=0;o<n.length;o++){var r=(s=n[o]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(r===e||r===t))return s}var i=document.getElementsByTagName("style");for(o=0;o<i.length;o++){var s;if((r=(s=i[o]).getAttribute("data-href"))===e||r===t)return s}})(o,r))return t();((e,t,n,o)=>{var r=document.createElement("link");r.rel="stylesheet",r.type="text/css",r.onerror=r.onload=i=>{if(r.onerror=r.onload=null,"load"===i.type)n();else{var s=i&&("load"===i.type?"missing":i.type),a=i&&i.target&&i.target.href||t,d=new Error("Loading CSS chunk "+e+" failed.\n("+a+")");d.code="CSS_CHUNK_LOAD_FAILED",d.type=s,d.request=a,r.parentNode.removeChild(r),o(d)}},r.href=t,document.head.appendChild(r)})(e,r,t,n)})),i={179:0},l.f.miniCss=(e,t)=>{i[e]?t.push(i[e]):0!==i[e]&&{139:1}[e]&&t.push(i[e]=r(e).then((()=>{i[e]=0}),(t=>{throw delete i[e],t})))},(()=>{var e={179:0};l.f.j=(t,n)=>{var o=l.o(e,t)?e[t]:void 0;if(0!==o)if(o)n.push(o[2]);else if(524==t){var r=new Promise(((n,r)=>{o=e[t]=[n,r]}));n.push(o[2]=r);var i=l.p+l.u(t),s=new Error;l.l(i,(n=>{if(l.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var r=n&&("load"===n.type?"missing":n.type),i=n&&n.target&&n.target.src;s.message="Loading chunk "+t+" failed.\n("+r+": "+i+")",s.name="ChunkLoadError",s.type=r,s.request=i,o[1](s)}}),"chunk-"+t)}else e[t]=0},l.F.j=t=>{if((!l.o(e,t)||void 0===e[t])&&524==t){e[t]=null;var n=document.createElement("link");l.nc&&n.setAttribute("nonce",l.nc),n.rel="prefetch",n.as="script",n.href=l.p+l.u(t),document.head.appendChild(n)}};var t=(t,n)=>{for(var o,r,[i,s,a]=n,d=0,c=[];d<i.length;d++)r=i[d],l.o(e,r)&&e[r]&&c.push(e[r][0]),e[r]=0;for(o in s)l.o(s,o)&&(l.m[o]=s[o]);for(a&&a(l),t&&t(n);c.length;)c.shift()()},n=self.webpackChunkp3x_redis_ui_material=self.webpackChunkp3x_redis_ui_material||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),s=l.x,l.x=()=>{var e=s();return l.E(139),l.E(524),e},l(8565),l(5498),l.g.p3xr=l.g.p3xr||{},p3xr.destroy=()=>{},p3xr.theme={dark:void 0,light:void 0},p3xr.ui={overlay:void 0,htmlEncode:l.g.htmlEncode},l(4380),l(3581),l(6399),l(7943),l(4117),l(8820),l(9567),l(7293),l(8308),l(6566),l(7804),p3xr.settings.language.translation.en=l(3555),p3xr.settings.language.translation.zn=l(7885),l(6996),l.x()})();