{{!
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
}}
<div id="deploy-summary">
  <h2>{{t installer.step10.header}}</h2>
  {{#if view.serviceRestartText}}
    <div id="step10-alert-message" class="alert alert-danger">
      {{{view.serviceRestartText}}}
    </div>
  {{/if}}
  <div class="alert alert-info">
    {{t installer.step10.body}}
  </div>
  <div id="step10-content" class="well pre-scrollable">
    <ul>
      {{#each item in clusterInfo}}
        <li>
          <span {{bindAttr class="item.color"}}>{{item.displayStatement}}</span>
          <ul>
            {{#each status in item.status}}
              <li>
                <span {{bindAttr class="status.color"}}>{{status.displayStatement}}</span>
                <ul>
                  {{#each statement in status.statements}}
                    <li>
                      <span {{bindAttr class="status.color"}}>{{statement.displayStatement}}</span>
                    </li>
                  {{/each}}
                </ul>
              </li>
            {{/each}}
          </ul>
        </li>
      {{/each}}
    </ul>
  </div>
  <div class="btn-area">
    <button type="button" class="btn btn-success pull-right" {{bindAttr disabled="App.router.btnClickInProgress"}} {{action complete}}>
      {{#if App.router.nextBtnClickInProgress}}
        {{view App.SpinnerView tagName="span" classNames="service-button-spinner"}}
      {{/if}}
      {{t common.complete}} &rarr;
    </button>
  </div>
</div>