text:
package com.vaadin.addon.charts.model;

import com.vaadin.addon.charts.model.style.Style;
/**
 * Highchart by default puts a credits label in the lower right corner of the
 * chart. This can be changed using these options.
 */
public class Credits extends AbstractConfigurationObject {

	private static final long serialVersionUID = 1L;
	private Boolean enabled;
	private String href;
	private Position position;
	private Style style;
	private String text;

	public Credits() {
	}

	public Credits(Boolean enabled) {
		this.enabled = enabled;
	}

	/**
	 * @see #setEnabled(Boolean)
	 */
	public Boolean getEnabled() {
		return enabled;
	}

	/**
	 * Whether to show the credits text.
	 *

	 * Defaults to: true
	 */
	public void setEnabled(Boolean enabled) {
		this.enabled = enabled;
	}

	/**
	 * @see #setHref(String)
	 */
	public String getHref() {
		return href;
	}

	/**
	 * The URL for the credits label.
	 *

	 * Defaults to: http://www.highcharts.com
	 */
	public void setHref(String href) {
		this.href = href;
	}

	/**
	 * @see #setPosition(Position)
	 */
	public Position getPosition() {
		return position;
	}

	/**
	 * Position configuration for the credits label. Supported properties are
	 * align, verticalAlign, x and
	 * y. Defaults to
	 *
	 *

	 * position: {
	 * 		align: 'right',
	 * 		x: -10,
	 * 		verticalAlign: 'bottom',
	 * 		y: -5
	 * 	}
	 *

	 */
	public void setPosition(Position position) {
		this.position = position;
	}

	/**
	 * @see #setStyle(Style)
	 */
	public Style getStyle() {
		return style;
	}

	/**
	 * CSS styles for the credits label. Defaults to:
	 *
	 *

	 * style: {
	 * 		cursor: 'pointer',
	 * 		color: '#909090',
	 * 		fontSize: '10px'
	 *
	 * 	}
	 *

	 */
	public void setStyle(Style style) {
		this.style = style;
	}

	public Credits(String text) {
		this.text = text;
	}

	/**
	 * @see #setText(String)
	 */
	public String getText() {
		return text;
	}

	/**
	 * The text for the credits label.
	 *

	 * Defaults to: Highcharts.com
	 */
	public void setText(String text) {
		this.text = text;
	}
}


text:
<?php

namespace Oro\Bundle\ReportBundle\Migrations\Schema\v2_3;

use Doctrine\DBAL\Platforms\MySQL57Platform;
use Oro\Bundle\MigrationBundle\Migration\ArrayLogger;
use Oro\Bundle\MigrationBundle\Migration\ParametrizedMigrationQuery;
use Psr\Log\LoggerInterface;

/**
 * Update field database type for oro_report.chart_options field on mysql 5.7 to use native JSON
 */
class UpdateJsonArrayQuery extends ParametrizedMigrationQuery
{
    public function getDescription()
    {
        $logger = new ArrayLogger();
        $logger->info(
            'Convert a column with "DC2Type:json_array" type to "JSON" type on MySQL >= 5.7.8 and Doctrine 2.7'
        );
        $this->doExecute($logger, true);

        return $logger->getMessages();
    }

    /**
     * {@inheritdoc}
     */
    public function execute(LoggerInterface $logger)
    {
        $this->doExecute($logger);
    }

    /**
     * {@inheritdoc}
     */
    public function doExecute(LoggerInterface $logger, $dryRun = false)
    {
        $platform = $this->connection->getDatabasePlatform();
        if ($platform instanceof MySQL57Platform) {
            $updateSql = "ALTER TABLE oro_report ".
                "CHANGE chart_options chart_options JSON DEFAULT NULL COMMENT '(DC2Type:json_array)'";

            $this->logQuery($logger, $updateSql);
            if (!$dryRun) {
                $this->connection->executeUpdate($updateSql);
            }
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
Simple schema for JavaScript objects, with validation and flexible error messages.

## Usage

```
$ npm install simple-object-schema --save
```

```JavaScript
const Schema = require('simple-object-schema').default;
const messageTypes = require('simple-object-schema').messageTypes;
```

or with `import`

```JavaScript
import Schema, { messageTypes } from 'simple-object-schema'
```

## Examples

### ES2015

```JavaScript
import Schema, { messageTypes } from 'simple-object-schema';

class FooSchema extends Schema {
  constructor(options) {
    super(options);
    this.schema = {
      id: this.define.type(Number).isRequired(),
      name: this.define.type(String).isRequired().label('Display Name'),
      createdAt: this.define.type(Date).defaultsTo(Date.now()).label('Created At'),
    }
  }

  validate(values) {
    return super.validate(values, this.schema);
  }
}

const foo = new FooSchema();

const results = foo.validate({
  id: 100,
  name: 'nanopx',
});

console.log(results);
// { values: { id: 100, name: 'nanopx', createdAt: 1465487357721 },
//   errors: null }
```

### Using `require()`

```JavaScript
const Schema = require('simple-object-schema').default;
const messageTypes = require('simple-object-schema').messageTypes;

const schema = new Schema();

const fooSchema = {
  foo: schema.define.type(Number).min(100).max(200).equalsTo(150).isRequired().label('FOO'),
  bar: schema.define.type([Number, Boolean]).defaultsTo(100).isRequired().label('BAR'),
  baz: schema.define.type(String).match(/hello/).isRequired(),
  abc: schema.define.type(String).in(['ABC', 'DEF']),
};

// Pass
console.log(schema.validate({ foo: 150, bar: undefined, baz: 'hello' }, fooSchema));
// { values: { foo: 150, bar: 100, baz: 'hello' },
//   errors: null }

// Fail
console.log(schema.validate({ foo: 10000, bar: 'string', baz: 'helo', notDefinedInSchema: 'hello' }, fooSchema));
// { values: null,
//   errors:
//    { __root__: [ 'Key "notDefinedInSchema" is not defined in schema' ],
//      foo:
//       [ '"FOO" must be less than 200',
//         '"FOO" must be equal to "150"' ],
//      bar: [ '"BAR" must be one of "Number, Boolean", but the type of given value was "String"' ],
//      baz: [ '"baz" does not match pattern "/hello/"' ] } }

// Fail, with partially overridden message
const locale = {};
locale[messageTypes.IS_REQUIRED] = '{{name}} IS REQUIRED!';
const schema2 = new Schema({ locale: locale });
console.log(schema2.validate({ foo: null, bar: 'string', baz: 'helo', notDefinedInSchema: 'hello' }, fooSchema));
// { values: null,
//   errors:
//    { __root__: [ 'Key "notDefinedInSchema" is not defined in schema' ],
//      foo:
//       [ 'FOO IS REQUIRED!',
//         '"FOO" must be a "Number"',
//         '"FOO" must be equal to "150"' ],
//      bar: [ '"BAR" must be one of "Number, Boolean", but the type of given value was "String"' ],
//      baz: [ '"baz" does not match pattern "/hello/"' ] } }

// Using locale preset
const schema3 = new Schema({ locale: Schema.locales.ja });
console.log(schema3.validate({ foo: null, bar: 'string', baz: 'helo', notDefinedInSchema: 'hello', abc: 'FOO' }, fooSchema));
// { values: null,
//   errors:
//    { __root__: [ 'スキーマに"notDefinedInSchema"が定義されていません。' ],
//      foo:
//       [ '"FOO"は必須です。',
//         '"FOO"は数字でなければなりません。',
//         '"FOO"は"150"と同じでなければなりません。' ],
//      bar: [ '"BAR"は"数字, 真偽"の何れかの型でなければなりません。指定された値は"文字列"型でした。' ],
//      baz: [ '"baz"は正規表現の"/hello/"に一致しませんでした。' ],
//      abc: [ '"abc"は"ABC, DEF"の何れかと一致しなければなりません。' ] } }
```

### Todo

- [ ] Add more docs

### License

MIT


text:
#include <cmath>

#include "CoordinateConverter.h"

CoordinateConverter::CoordinateConverter()
	: screenHeight(480), screenWidth(640), horizontalFieldOfView(58.0f), verticalFieldOfView(45.0f)
{
	setScreenCenter();
	setCoeffXAndCoeffY();
}

CoordinateConverter::CoordinateConverter(int scrHghtX, int scrWdthY, float hFV, float vFV)
	: screenHeight(scrHghtX), screenWidth(scrWdthY), horizontalFieldOfView(hFV), verticalFieldOfView(vFV)
{
	setScreenCenter();
	setCoeffXAndCoeffY();
}

void CoordinateConverter::setScreenCenter()
{
	screenCenterX = screenWidth / 2;
	screenCenterY = screenHeight / 2;
}

void CoordinateConverter::setCoeffXAndCoeffY()
{
	float xzFactor = (2.0f * tan(degToRad(horizontalFieldOfView/2.0f)));
	float yzFactor = (2.0f * tan(degToRad(verticalFieldOfView/2.0f)));

	f_x = static_cast<float>(screenWidth) / xzFactor;
	f_y = static_cast<float>(screenHeight) / yzFactor;
}

void CoordinateConverter::depthToWorld(int depthX, int depthY, int depthZ, float& worldX, float& worldY, float& worldZ)
{
	worldZ = rawDepthToMeters(depthZ);

	worldX = worldZ * static_cast<float>(screenCenterX - depthX) / f_x;
	worldY = worldZ * static_cast<float>(screenCenterY - depthY) / f_y;
}

float CoordinateConverter::rawDepthToMeters(int rawDepth)
{
	float rawDepthF = static_cast<double>(rawDepth);

	if (rawDepth <= 0xFFFF)
	{
		// following values acquired during aadc xtion depth sensor calibration
		float depth = 3.33776840956e-05f * rawDepthF + -0.0674169620271f;
		return (depth);
	}

	return 0.0f;
}

float CoordinateConverter::degToRad(float degValue)
{
	return degValue * M_PI / 180.0f;
}


text:
namespace parlex {
namespace detail {

struct leaf;
using automaton = nfa<leaf const *, size_t>;

struct node {
	virtual ~node() = default;
	using children_t = std::vector<erased<node>>;
	std::string tag;
	children_t children;
	node * parent = nullptr;
	// a table from all descendant leafs keys, to the child node containing the key
	collections::coherent_map<leaf const *, node const *> leaf_paths;

	void add_child(const erased<node>& child);
	virtual bool is_leaf() const;
	void compute_leaf_paths();
	virtual automaton to_nfa() const = 0;
	automaton compile();
	node const * follow_or_nullptr(leaf const * l) const;
protected:
	node() = default;
	node(std::initializer_list<erased<node>> const & children);
	node(std::string const & tag, std::initializer_list<erased<node>> const & children);
	node(node const & copy) = default;
};

struct leaf : node {
	uint16_t recognizer_index;
	bool is_leaf() const override;
protected:
	explicit leaf(std::string const & tag);
private:
	automaton to_nfa() const override;
};

} // namespace detail

struct literal final : detail::leaf {
	explicit literal(std::u32string const & content);
	explicit literal(std::string const & tag, std::u32string const & content);
	literal(literal const & copy) = default;

	std::u32string const content;
};

struct reference final : detail::leaf {
	explicit reference(std::string const & target);
	explicit reference(std::string const & tag, std::string const & target);

	reference(reference const & copy) = default;

	std::string const target;
};

struct sequence final : detail::node {
	sequence() = default;
	sequence(std::initializer_list<erased<node>>&& children) : node(children) {}
	sequence(std::string const & tag, std::initializer_list<erased<node>>&& children) : node(tag, children) {}
	sequence(sequence const & copy) = default;
	bool is_leaf() const override { return false; }
	detail::automaton to_nfa() const override;
};

struct choice final : detail::node {
	choice() = default;
	choice(std::initializer_list<erased<node>>&& children) : node(children) {}
	choice(std::string const & tag, std::initializer_list<erased<node>>&& children) : node(tag, children) {}
	choice(choice const & copy) = default;
	bool is_leaf() const override { return false; }
	detail::automaton to_nfa() const override;
};

struct optional final : detail::node {
	optional() = default;
	explicit optional(erased<node> const & child) : node({ child }) {}
	optional(std::string const & tag, erased<node> const & child) : node(tag, { child }) {}
	optional(optional const & copy) = default;
	detail::automaton to_nfa() const override;
};

struct repetition final : detail::node {
	repetition() = default;
	explicit repetition(erased<node> const & child) : node({child}) {}
	repetition(std::string const & tag, erased<node> const & child) : node(tag, {child}) {}
	repetition(repetition const & copy) = default;
	detail::automaton to_nfa() const override;
};

struct production {
	production(
		std::string const & name,
		erased<detail::node> const & behavior,
		associativity assoc = associativity::NONE,
		filter_function const & filter = filter_function(),
		std::set<std::string> const & precedences = std::set<std::string>()
	);

	std::string name;
	erased<detail::node> behavior;
	filter_function filter;
	associativity assoc;
	std::set<std::string> precedences;

	void extract_string_literals(std::set<std::u32string> & results) const;
	std::string to_dot() const;
};

struct sub_builder {
	sub_builder() = default;
	explicit sub_builder(std::vector<production> const & productions);
	std::vector<production> productions;
	std::set<std::u32string> extract_string_literals() const;
};

struct builder : sub_builder {
	std::string root_name;

	builder() = default;
	builder(std::string const & rootName, std::vector<production> const & productions);
};

} // namespace parlex

#endif //BUILDER_HPP


text:
ACCEPTED

#### According to
The Catalogue of Life, 3rd January 2011

#### Published in
Cephalosporium-artige Schimmelpilze (Stuttgart) 162 (1971)

#### Original name
Cephalosporium nordinii Bourch., 1961

### Remarks
null


text:
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Diagnostics.Contracts;
using System;

// Disable the "this variable is not used" warning as every field would imply it.
#pragma warning disable 0414
// Disable the "this variable is never assigned to".
#pragma warning disable 0067
// Disable the "this event is never assigned to".
#pragma warning disable 0649
// Disable the "this variable is never used".
#pragma warning disable 0169
// Disable the "new keyword not required" warning.
#pragma warning disable 0109
// Disable the "extern without DllImport" warning.
#pragma warning disable 0626
// Disable the "could hide other member" warning, can happen on certain properties.
#pragma warning disable 0108

namespace System.ComponentModel.Composition
{
  public partial class ImportCardinalityMismatchException : Exception
  {
    #region Methods and constructors
    public ImportCardinalityMismatchException(string message, Exception innerException)
    {
    }

    protected ImportCardinalityMismatchException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    {
    }

    public ImportCardinalityMismatchException()
    {
    }

    public ImportCardinalityMismatchException(string message)
    {
    }
    #endregion
  }
}


text:
/*
 * Copyright (C) 1990,91   Silicon Graphics, Inc.
 *
 _______________________________________________________________________
 ______________  S I L I C O N   G R A P H I C S   I N C .  ____________
 |
 |   $Revision: 1.1.1.1 $
 |
 |   Classes:
 |      SoTextureCoordinateFunction.  Abstract base class for all
 |      texture coordiante functions.
 |
 |   Author(s)          : Paul Isaacs
 |
 ______________  S I L I C O N   G R A P H I C S   I N C .  ____________
 _______________________________________________________________________
 */

#include <Inventor/nodes/SoTextureCoordinateFunction.h>

SO_NODE_SOURCE(SoTextureCoordinateFunction);

////////////////////////////////////////////////////////////////////////
//
// Description:
//    Constructor
//
// Use: public

SoTextureCoordinateFunction::SoTextureCoordinateFunction()
//
////////////////////////////////////////////////////////////////////////
{
    SO_NODE_CONSTRUCTOR(SoTextureCoordinateFunction);
    isBuiltIn = TRUE;
}

////////////////////////////////////////////////////////////////////////
//
// Description:
//    Destructor
//
// Use: public

SoTextureCoordinateFunction::~SoTextureCoordinateFunction()
//
////////////////////////////////////////////////////////////////////////
{
}


text:
require 'inspector_gadgit'
require 'rspec'
require 'pry'

Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}

RSpec.configure do |config|
  config.include RepositoryHelpers
end


text:
import { BrowserModule }                from '@angular/platform-browser';
import { NgModule }                     from '@angular/core';

import { DemoTimeNowComponent }         from './demo-timenow.component';
import { NowComponent } from './time_now.component'

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ DemoTimeNowComponent, NowComponent ],
  bootstrap: [ DemoTimeNowComponent ]
})

export class DemoTimeNowModule {
  constructor() {
  }
}


text:
package com.thoughtworks.xstream.converters.extended;

import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.SingleValueConverter;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.core.ClassLoaderReference;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class JavaMethodConverter
  implements Converter
{
  private final SingleValueConverter javaClassConverter;

  protected JavaMethodConverter(SingleValueConverter paramSingleValueConverter)
  {
    this.javaClassConverter = paramSingleValueConverter;
  }

  public JavaMethodConverter(ClassLoaderReference paramClassLoaderReference)
  {
    this(new JavaClassConverter(paramClassLoaderReference));
  }

  public JavaMethodConverter(ClassLoader paramClassLoader)
  {
    this(new ClassLoaderReference(paramClassLoader));
  }

  private void marshalMethod(HierarchicalStreamWriter paramHierarchicalStreamWriter, String paramString1, String paramString2, Class[] paramArrayOfClass)
  {
    paramHierarchicalStreamWriter.startNode("class");
    paramHierarchicalStreamWriter.setValue(paramString1);
    paramHierarchicalStreamWriter.endNode();
    if (paramString2 != null)
    {
      paramHierarchicalStreamWriter.startNode("name");
      paramHierarchicalStreamWriter.setValue(paramString2);
      paramHierarchicalStreamWriter.endNode();
    }
    paramHierarchicalStreamWriter.startNode("parameter-types");
    for (int i = 0; i < paramArrayOfClass.length; i++)
    {
      paramHierarchicalStreamWriter.startNode("class");
      paramHierarchicalStreamWriter.setValue(this.javaClassConverter.toString(paramArrayOfClass[i]));
      paramHierarchicalStreamWriter.endNode();
    }
    paramHierarchicalStreamWriter.endNode();
  }

  public boolean canConvert(Class paramClass)
  {
    return (paramClass.equals(Method.class)) || (paramClass.equals(Constructor.class));
  }

  public void marshal(Object paramObject, HierarchicalStreamWriter paramHierarchicalStreamWriter, MarshallingContext paramMarshallingContext)
  {
    if ((paramObject instanceof Method))
    {
      Method localMethod = (Method)paramObject;
      marshalMethod(paramHierarchicalStreamWriter, this.javaClassConverter.toString(localMethod.getDeclaringClass()), localMethod.getName(), localMethod.getParameterTypes());
      return;
    }
    Constructor localConstructor = (Constructor)paramObject;
    marshalMethod(paramHierarchicalStreamWriter, this.javaClassConverter.toString(localConstructor.getDeclaringClass()), null, localConstructor.getParameterTypes());
  }

  public Object unmarshal(HierarchicalStreamReader paramHierarchicalStreamReader, UnmarshallingContext paramUnmarshallingContext)
  {
    try
    {
      boolean bool = paramUnmarshallingContext.getRequiredType().equals(Method.class);
      paramHierarchicalStreamReader.moveDown();
      String str1 = paramHierarchicalStreamReader.getValue();
      Class localClass = (Class)this.javaClassConverter.fromString(str1);
      paramHierarchicalStreamReader.moveUp();
      String str2 = null;
      if (bool)
      {
        paramHierarchicalStreamReader.moveDown();
        str2 = paramHierarchicalStreamReader.getValue();
        paramHierarchicalStreamReader.moveUp();
      }
      paramHierarchicalStreamReader.moveDown();
      ArrayList localArrayList = new ArrayList();
      while (paramHierarchicalStreamReader.hasMoreChildren())
      {
        paramHierarchicalStreamReader.moveDown();
        String str3 = paramHierarchicalStreamReader.getValue();
        localArrayList.add(this.javaClassConverter.fromString(str3));
        paramHierarchicalStreamReader.moveUp();
      }
      Class[] arrayOfClass = (Class[])localArrayList.toArray(new Class[localArrayList.size()]);
      paramHierarchicalStreamReader.moveUp();
      if (bool)
      {
        Method localMethod = localClass.getDeclaredMethod(str2, arrayOfClass);
        return localMethod;
      }
      Constructor localConstructor = localClass.getDeclaredConstructor(arrayOfClass);
      return localConstructor;
    }
    catch (NoSuchMethodException localNoSuchMethodException)
    {
      throw new ConversionException(localNoSuchMethodException);
    }
  }
}

/* Location:           /Users/vikas/Documents/Mhacks_Real_app/classes-dex2jar.jar
 * Qualified Name:     com.thoughtworks.xstream.converters.extended.JavaMethodConverter
 * JD-Core Version:    0.6.2
 */


text:
From: Haiwei Li <lihaiwei@tencent.com>

```c
From patchwork Mon Sep 14 09:11:46 2020
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Haiwei Li <lihaiwei.kernel@gmail.com>
X-Patchwork-Id: 11773377
Return-Path: <SRS0=+Hxv=CX=vger.kernel.org=kvm-owner@kernel.org>
Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org
 [172.30.200.123])
	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 81D3892C
	for <patchwork-kvm@patchwork.kernel.org>;
 Mon, 14 Sep 2020 09:12:29 +0000 (UTC)
Received: from vger.kernel.org (vger.kernel.org [23.128.96.18])
	by mail.kernel.org (Postfix) with ESMTP id 5AE7021741
	for <patchwork-kvm@patchwork.kernel.org>;
 Mon, 14 Sep 2020 09:12:29 +0000 (UTC)
Authentication-Results: mail.kernel.org;
	dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com
 header.b="sJ2tO4m0"
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
        id S1726222AbgINJMF (ORCPT
        <rfc822;patchwork-kvm@patchwork.kernel.org>);
        Mon, 14 Sep 2020 05:12:05 -0400
Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44996 "EHLO
        lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
        with ESMTP id S1726110AbgINJL6 (ORCPT <rfc822;kvm@vger.kernel.org>);
        Mon, 14 Sep 2020 05:11:58 -0400
Received: from mail-pg1-x541.google.com (mail-pg1-x541.google.com
 [IPv6:2607:f8b0:4864:20::541])
        by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0331CC06174A;
        Mon, 14 Sep 2020 02:11:57 -0700 (PDT)
Received: by mail-pg1-x541.google.com with SMTP id g29so11047182pgl.2;
        Mon, 14 Sep 2020 02:11:57 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20161025;
        h=from:to:cc:subject:date:message-id:mime-version
         :content-transfer-encoding;
        bh=W99SjuNiSKU93XEYz/Th2BW6EoBeF9ur8RNXOTGpu1M=;
        b=sJ2tO4m0oAnD4IaHdgbfzhxN5kDs6Q6yaRjZx0vSj69gJ2svy7mwhZj48Fp1mDoA8Q
         545/bKHg24Jc3SikYhxQDfPuuet3bSA7DBWIlkiy6X/7OuRvpmdnxydqYecICFR9Rkzu
         X+CvkyptRbWjn2NU192KPEUspCNs8LIXSAutLIdwbsQpKY0OWpgStK4QLry5ZwOEnBqd
         ylcgCsUPHHoMAAXCQJVo3eWidBqlg2H92E20PtXHfOGiLNlsyR+JxRohGalIaCUwiBuM
         DT5hgy1x7RezAF+6DZb7yE6BUwfSt7fTem8r0vmZ5SQDBZ1osry7KftwH7WHPPQKyk16
         P45A==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version
         :content-transfer-encoding;
        bh=W99SjuNiSKU93XEYz/Th2BW6EoBeF9ur8RNXOTGpu1M=;
        b=rPFaZ9WnFqHFjWOyrE4HFIEA3vqf0ReH8gNVF6zDKecCsf9gp5gj704NxA22TZVCVp
         srdW0rmJkmEEX9eNmUjTpwiN84zMYVkOGSwnDPjoRHuHGWg4mXC98WSEJpL4CVvvyWpO
         j222RtBsGn3jnUpFp8KWCMinQ74eE0PGBkLNHMPpOo9y6DFtIVLm1zSGR4MxzrwkHogL
         wDKRLPW/q7em7gaDJeUVvnGOQiNVMdwaX9Vly3fxpCRHKviFG9NRAJsWL62xI7kU9/3B
         UEAsgSBoixr+/pNBCQptIZERIxKpuFAuf+RRhZeU1SUo2qTJjQ/hSK7ULjETbY1g6E4z
         COQw==
X-Gm-Message-State: AOAM533YgFBvPOiFC93jjsLRX8/osiRMKW53e98MwxSL/MzAll/tku7z
        r+UDEMsRyRP/D5tRgq5gEfjewlqzVXW+
X-Google-Smtp-Source:
 ABdhPJxMww6wS2eqYuQaeZ4VZ5IYPYRduHbFKZ5oVJyid82p9FRMSJPhl9wvm4P9kGOW419jmV9EVA==
X-Received: by 2002:a62:1cc4:0:b029:13c:1611:653d with SMTP id
 c187-20020a621cc40000b029013c1611653dmr12858988pfc.15.1600074717033;
        Mon, 14 Sep 2020 02:11:57 -0700 (PDT)
Received: from LiHaiwei.tencent.com ([203.205.141.65])
        by smtp.gmail.com with ESMTPSA id
 m13sm8765179pjl.45.2020.09.14.02.11.52
        (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
        Mon, 14 Sep 2020 02:11:56 -0700 (PDT)
From: lihaiwei.kernel@gmail.com
To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, x86@kernel.org
Cc: pbonzini@redhat.com, sean.j.christopherson@intel.com,
        vkuznets@redhat.com, wanpengli@tencent.com, jmattson@google.com,
        joro@8bytes.org, tglx@linutronix.de, mingo@redhat.com,
        bp@alien8.de, hpa@zytor.com, lihaiwei@tencent.com
Subject: [PATCH 0/2] Fix the allocation of pv cpu mask
Date: Mon, 14 Sep 2020 17:11:46 +0800
Message-Id: <20200914091148.95654-1-lihaiwei.kernel@gmail.com>
X-Mailer: git-send-email 2.28.0
MIME-Version: 1.0
Sender: kvm-owner@vger.kernel.org
Precedence: bulk
List-ID: <kvm.vger.kernel.org>
X-Mailing-List: kvm@vger.kernel.org

From: Haiwei Li <lihaiwei@tencent.com>

Hi,

There is a old version patch of 'KVM: Check the allocation of pv cpu mask'
in upstream. The v2 and what is discussed is in url:

https://lore.kernel.org/kvm/87o8mlooki.fsf@vitty.brq.redhat.com/

In this patch, i fix the build error and make changes as suggested.

Haiwei Li (2):
  KVM: Fix the build error
  KVM: Check if __pv_cpu_mask was allocated instead of assigning ops too
    late

 arch/x86/kernel/kvm.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
```
#### [PATCH 0/2] KVM: VMX: Clean up IRQ/NMI handling
##### From: Sean Christopherson <sean.j.christopherson@intel.com>

```c
From patchwork Mon Sep 14 19:56:32 2020
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Sean Christopherson <sean.j.christopherson@intel.com>
X-Patchwork-Id: 11774757
Return-Path: <SRS0=+Hxv=CX=vger.kernel.org=kvm-owner@kernel.org>
Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org
 [172.30.200.123])
	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0BF7B6CA
	for <patchwork-kvm@patchwork.kernel.org>;
 Mon, 14 Sep 2020 19:56:42 +0000 (UTC)
Received: from vger.kernel.org (vger.kernel.org [23.128.96.18])
	by mail.kernel.org (Postfix) with ESMTP id E4ED0215A4
	for <patchwork-kvm@patchwork.kernel.org>;
 Mon, 14 Sep 2020 19:56:41 +0000 (UTC)
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
        id S1726033AbgINT4h (ORCPT
        <rfc822;patchwork-kvm@patchwork.kernel.org>);
        Mon, 14 Sep 2020 15:56:37 -0400
Received: from mga01.intel.com ([192.55.52.88]:50094 "EHLO mga01.intel.com"
        rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP
        id S1725961AbgINT4g (ORCPT <rfc822;kvm@vger.kernel.org>);
        Mon, 14 Sep 2020 15:56:36 -0400
IronPort-SDR:
 hk7D+S/eltzBrA8k+iCz6Vn2Jvq5sN5qsds3Dl6VbMyidi36NeEKR9GWCzCnTlfACuRpieBRt4
 RmmoKSRRewwg==
X-IronPort-AV: E=McAfee;i="6000,8403,9744"; a="177217546"
X-IronPort-AV: E=Sophos;i="5.76,427,1592895600";
   d="scan'208";a="177217546"
X-Amp-Result: SKIPPED(no attachment in message)
X-Amp-File-Uploaded: False
Received: from fmsmga008.fm.intel.com ([10.253.24.58])
  by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;
 14 Sep 2020 12:56:35 -0700
IronPort-SDR:
 MdEN13xKZ0uwTw3Wv173sApK1iJaywuHqbYr3TMFtChpWxcKXl+TFlIX+NRbu8EAlG1FY7yqIC
 j8hET53nG0uw==
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="5.76,427,1592895600";
   d="scan'208";a="287730761"
Received: from sjchrist-coffee.jf.intel.com ([10.54.74.160])
  by fmsmga008.fm.intel.com with ESMTP; 14 Sep 2020 12:56:35 -0700
From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Sean Christopherson <sean.j.christopherson@intel.com>,
        Vitaly Kuznetsov <vkuznets@redhat.com>,
        Wanpeng Li <wanpengli@tencent.com>,
        Jim Mattson <jmattson@google.com>,
        Joerg Roedel <joro@8bytes.org>, kvm@vger.kernel.org,
        linux-kernel@vger.kernel.org, Josh Poimboeuf <jpoimboe@redhat.com>,
        Uros Bizjak <ubizjak@gmail.com>,
        Andi Kleen <ak@linux.intel.com>
Subject: [PATCH 0/2] KVM: VMX: Clean up IRQ/NMI handling
Date: Mon, 14 Sep 2020 12:56:32 -0700
Message-Id: <20200914195634.12881-1-sean.j.christopherson@intel.com>
X-Mailer: git-send-email 2.28.0
MIME-Version: 1.0
Sender: kvm-owner@vger.kernel.org
Precedence: bulk
List-ID: <kvm.vger.kernel.org>
X-Mailing-List: kvm@vger.kernel.org

Minor (if there is such a thing for this code) cleanup of KVM's handling
of IRQ and NMI exits to move the invocation of the IRQ handler to a
standalone assembly routine, and to then consolidate the NMI handling to
use the same indirect call approach instead of using INTn.

The IRQ cleanup was suggested by Josh Poimboeuf in the context of a false
postive objtool warning[*].  I believe Josh intended to use UNWIND hints
instead of trickery to avoid objtool complaints.  I opted for trickery in
the form of a redundant, but explicit, restoration of RSP after the hidden
IRET.  AFAICT, there are no existing UNWIND hints that would let objtool
know that the stack is magically being restored, and adding a new hint to
save a single MOV <reg>, <reg> instruction seemed like overkill.

The NMI consolidation was loosely suggested by Andi Kleen.  Andi's actual
suggestion was to export and directly call the NMI handler, but that's a
more involved change (unless I'm misunderstanding the wants of the NMI
handler), whereas piggybacking the IRQ code is simple and seems like a
worthwhile intermediate step.

[*] https://lkml.kernel.org/r/20200908205947.arryy75c5cvldps7@treble

Sean Christopherson (2):
  KVM: VMX: Move IRQ invocation to assembly subroutine
  KVM: VMX: Invoke NMI handler via indirect call instead of INTn

 arch/x86/kvm/vmx/vmenter.S | 28 +++++++++++++++++
 arch/x86/kvm/vmx/vmx.c     | 61 +++++++++++---------------------------
 2 files changed, 45 insertions(+), 44 deletions(-)
```
#### [RFC PATCH 00/35] SEV-ES hypervisor support
##### From: Tom Lendacky <thomas.lendacky@amd.com>
From: Tom Lendacky <thomas.lendacky@amd.com>

```c
From patchwork Mon Sep 14 20:15:14 2020
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Tom Lendacky <thomas.lendacky@amd.com>
X-Patchwork-Id: 11774763
Return-Path: <SRS0=+Hxv=CX=vger.kernel.org=kvm-owner@kernel.org>
Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org
 [172.30.200.123])
	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 94788112E
	for <patchwork-kvm@patchwork.kernel.org>;
 Mon, 14 Sep 2020 20:16:26 +0000 (UTC)
Received: from vger.kernel.org (vger.kernel.org [23.128.96.18])
	by mail.kernel.org (Postfix) with ESMTP id 6CE45217BA
	for <patchwork-kvm@patchwork.kernel.org>;
 Mon, 14 Sep 2020 20:16:26 +0000 (UTC)
Authentication-Results: mail.kernel.org;
	dkim=pass (1024-bit key) header.d=amdcloud.onmicrosoft.com
 header.i=@amdcloud.onmicrosoft.com header.b="bED58Uk4"
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
        id S1726020AbgINUQL (ORCPT
        <rfc822;patchwork-kvm@patchwork.kernel.org>);
        Mon, 14 Sep 2020 16:16:11 -0400
Received: from mail-bn8nam12on2061.outbound.protection.outlook.com
 ([40.107.237.61]:36897
        "EHLO NAM12-BN8-obe.outbound.protection.outlook.com"
        rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP
        id S1725920AbgINUQF (ORCPT <rfc822;kvm@vger.kernel.org>);
        Mon, 14 Sep 2020 16:16:05 -0400
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=EsfooNT4d1WaM0poVYWFRpHbUm2Edd9SdWBDZ6k+q5RCfERI8/dAeONA7qgWU0Rl8DfFSlGMIPIGg+9L3Mcwikkr2/5QRDiYJwoZiYxYlZGzXzr2kmbksU62cbKEf2N9cfkQwIQFd03Bp2BwDoeU2OAHfx5/PND8vUG1NskpX19aBMlCKEQ1SDnGBHW0G7UXh1oZMFz2AXKEBa/Nz+H3+P4p+c2CyMHkYoE4JV8q/yWuIP90Kr+DnyWWnZNAlYqGgfdT0Bzc5EJ0gvEVMVbqpzb05ts5WlTzwzdncPM4HKrcwt0SwN2HTOX78dQAj6mbuAxba3ErRVH+M8YuCbhOyA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;
 s=arcselector9901;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=WYvn9Vebdcfz1oLEgLq7F1lIAuqBh67EZz7g/n1MHlM=;
 b=GCoo4BlOoePZo+4mbQlOCtHVpNMYWtbA7ni0xCgRVZE3TMFPR1QP54FSMjmRu3xHfnW2I3EpVcJQaCkdpVWbNYPUQR9LxiJuhyb2GILqo9KwKl2CedBTcXkyvhxJoADeptnE8ogjX7csERnqbuzYH1ntZYAEJs6P7D0ALmDn3/aHI1+qLTPIlz1/MV03xYW4ao85Wm3FIYQAlVDaXTDVHzZI0UvTs0/fdQwURB8ZsWuOU2stjgo2nxQCZwGMQ/qCj+QjH4j2og0zzkbdBdwOZlwdMrssL7d+2eaA/P+mfOJZrvHMF2c2iFDS8c6s0Dx9cY67IP/d4oqqFXNV+dDLow==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass
 header.d=amd.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=WYvn9Vebdcfz1oLEgLq7F1lIAuqBh67EZz7g/n1MHlM=;
 b=bED58Uk4n/I/YkdN+eiN2Eg9j4xr7K4p6TY4YXnJD1iXc0IA8yiV/KNlMeUi0IWwkpBUcCrEf4ANysq7hpmKthFpPWRs7f2IDCbmC7TiJqGFqPLu+/N5Pf3YKfN6BHuhhkBMbo4AcYIM1M+JV/+DUtZuO3pTV1Oj3WlwMJYEK0A=
Authentication-Results: vger.kernel.org; dkim=none (message not signed)
 header.d=none;vger.kernel.org; dmarc=none action=none header.from=amd.com;
Received: from DM5PR12MB1355.namprd12.prod.outlook.com (2603:10b6:3:6e::7) by
 DM5PR12MB1163.namprd12.prod.outlook.com (2603:10b6:3:7a::18) with Microsoft
 SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.3370.16; Mon, 14 Sep 2020 20:16:00 +0000
Received: from DM5PR12MB1355.namprd12.prod.outlook.com
 ([fe80::299a:8ed2:23fc:6346]) by DM5PR12MB1355.namprd12.prod.outlook.com
 ([fe80::299a:8ed2:23fc:6346%3]) with mapi id 15.20.3370.019; Mon, 14 Sep 2020
 20:15:59 +0000
From: Tom Lendacky <thomas.lendacky@amd.com>
To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
        Jim Mattson <jmattson@google.com>,
        Joerg Roedel <joro@8bytes.org>,
        Sean Christopherson <sean.j.christopherson@intel.com>,
        Vitaly Kuznetsov <vkuznets@redhat.com>,
        Wanpeng Li <wanpengli@tencent.com>,
        Borislav Petkov <bp@alien8.de>, Ingo Molnar <mingo@redhat.com>,
        Thomas Gleixner <tglx@linutronix.de>,
        Brijesh Singh <brijesh.singh@amd.com>
Subject: [RFC PATCH 00/35] SEV-ES hypervisor support
Date: Mon, 14 Sep 2020 15:15:14 -0500
Message-Id: <cover.1600114548.git.thomas.lendacky@amd.com>
X-Mailer: git-send-email 2.28.0
X-ClientProxiedBy: SA0PR11CA0030.namprd11.prod.outlook.com
 (2603:10b6:806:d3::35) To DM5PR12MB1355.namprd12.prod.outlook.com
 (2603:10b6:3:6e::7)
MIME-Version: 1.0
X-MS-Exchange-MessageSentRepresentingType: 1
Received: from tlendack-t1.amd.com (165.204.77.1) by
 SA0PR11CA0030.namprd11.prod.outlook.com (2603:10b6:806:d3::35) with Microsoft
 SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3370.16 via Frontend
 Transport; Mon, 14 Sep 2020 20:15:58 +0000
X-Mailer: git-send-email 2.28.0
X-Originating-IP: [165.204.77.1]
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-HT: Tenant
X-MS-Office365-Filtering-Correlation-Id: 219fb91d-e54c-45c4-e70b-08d858eafee8
X-MS-TrafficTypeDiagnostic: DM5PR12MB1163:
X-MS-Exchange-Transport-Forked: True
X-Microsoft-Antispam-PRVS:
 <DM5PR12MB11633EBF82D967597ED903F3EC230@DM5PR12MB1163.namprd12.prod.outlook.com>
X-MS-Oob-TLC-OOBClassifiers: OLM:4125;
X-MS-Exchange-SenderADCheck: 1
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info:
 nqc2CSoVQijDexCPTorrXOQVSdrB3RmtRtB46alV8cH36WeZxVsQx2roJoukb5jrkaTwLFOoSkXUh8fvyf36Jz3VcFJRWBxH39LIp0idTtxa65MIRaihS85qYb+HWx7MAs/A+ZX5/yBChg5R+ipi/t+R9XRhxKrFrBQ+oyRcQ9eF3zgZ/36B8vR0Q05qaPcLA724aVPILU8wcTwojvp/8MhO3HrIhmg2yFz4V73SvHZmzuTydTZuIv7uoyPcWaTg6Lg1ctTXG/HBfyhJ+MRnOKmg/irg5nSrawBRiR3oGKDMpoVsvc8kx00Cy4W4MdEigjiZ4JKPu09G/Xkx7w79ClHnVrsM961OJbJbbQFhHjE7qTumnRxvoNA0uqocZQYDKZMg/OJYjEd3wzgZlbWQUA==
X-Forefront-Antispam-Report:
 CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM5PR12MB1355.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(136003)(396003)(366004)(376002)(39860400002)(346002)(8676002)(478600001)(83380400001)(26005)(316002)(966005)(7416002)(2906002)(5660300002)(6666004)(956004)(86362001)(186003)(16526019)(52116002)(7696005)(66556008)(66476007)(66946007)(4326008)(8936002)(54906003)(36756003)(2616005)(6486002);DIR:OUT;SFP:1101;
X-MS-Exchange-AntiSpam-MessageData:
 r24sUbM+9gCDKI0QHR0OXboIvyJa/NhWb/k6UKT17byypa0OG95DOrVFvTEtez/4ZCHgr7fJ5tesIb3y1LuMYqsJoJEPuL0MQGDvgNJVAj+8gc5sUjQw4QX5LYJqUDOjhXST5C8o//gtLhizHemHFhoQXw71C4CXdXlmDhXdCyZ5fXZxq/iwfuhwGc7H90Z+V/fEX1nsnddJYQcjonS1LugbSkp1hMcPW4rfKP3ktrjMHmAWdM6K1Qegjb2b+72x/iSAFm1kdvIGQEeH6gjXjOs17TdsUwdY9zdteta0J1xNGLB2qlOpzj1kqry/eESwmlX9C4DhJpAhPWBTOx9ttSWOs32xKhK9ts6bkKU00lNuOQ1FPhdQ4a3c78x3k3dB1d15Fra6MUWg4f78xjJOX1V8jvNGhN1P6+cyxRR4+WkxbFhnXb8/J/s4ymK9qVJ4VyIyObcov2cmJ3wGGwr6roPk/ykQaNyL7jAYKPoftWuZWrk1hMmfYWOM9nWiVTcZg5IX2VHqEzUu5QGn98F8jH6UijX2YV9x0TfzuFdzfELAv5TrMCfjMTo+25iVJ2vh9qS96hxgUQGPH8ZXEvv5rCxZJOuE99dMV8iPgU9GTcnlr/0QwPiFqNfs17l9yWX8XHgO1k4+VCUgqu9vKpZLEw==
X-OriginatorOrg: amd.com
X-MS-Exchange-CrossTenant-Network-Message-Id:
 219fb91d-e54c-45c4-e70b-08d858eafee8
X-MS-Exchange-CrossTenant-AuthSource: DM5PR12MB1355.namprd12.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2020 20:15:59.7162
 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName:
 81hsqqIqJa4sgQT95Nsr/+hP0anQ1QAUeERsugdNF+5u39KKkRqyltkWP8b+0SpqI3rYYSQek34NkBQzFIvnCw==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR12MB1163
Sender: kvm-owner@vger.kernel.org
Precedence: bulk
List-ID: <kvm.vger.kernel.org>
X-Mailing-List: kvm@vger.kernel.org

From: Tom Lendacky <thomas.lendacky@amd.com>

This patch series provides support for running SEV-ES guests under KVM.

Secure Encrypted Virtualization - Encrypted State (SEV-ES) expands on the
SEV support to protect the guest register state from the hypervisor. See
"AMD64 Architecture Programmer's Manual Volume 2: System Programming",
section "15.35 Encrypted State (SEV-ES)" [1].

In order to allow a hypervisor to perform functions on behalf of a guest,
there is architectural support for notifying a guest's operating system
when certain types of VMEXITs are about to occur. This allows the guest to
selectively share information with the hypervisor to satisfy the requested
function. The notification is performed using a new exception, the VMM
Communication exception (#VC). The information is shared through the
Guest-Hypervisor Communication Block (GHCB) using the VMGEXIT instruction.
The GHCB format and the protocol for using it is documented in "SEV-ES
Guest-Hypervisor Communication Block Standardization" [2].

Under SEV-ES, a vCPU save area (VMSA) must be encrypted. SVM is updated to
build the initial VMSA and then encrypt it before running the guest. Once
encrypted, it must not be modified by the hypervisor. Modification of the
VMSA will result in the VMRUN instruction failing with a SHUTDOWN exit
code. KVM must support the VMGEXIT exit code in order to perform the
necessary functions required of the guest. The GHCB is used to exchange
the information needed by both the hypervisor and the guest.

To simplify access to the VMSA and the GHCB, SVM uses an accessor function
to obtain the address of the either the VMSA or the GHCB, depending on the
stage of execution of the guest.

There are changes to some of the intercepts that are needed under SEV-ES.
For example, CR0 writes cannot be intercepted, so the code needs to ensure
that the intercept is not enabled during execution or that the hypervisor
does not try to read the register as part of exit processing. Another
example is shutdown processing, where the vCPU cannot be directly reset.

Support is added to handle VMGEXIT events and implement the GHCB protocol.
This includes supporting standard exit events, like a CPUID instruction
intercept, to new support, for things like AP processor booting. Much of
the existing SVM intercept support can be re-used by setting the exit
code information from the VMGEXIT and calling the appropriate intercept
handlers.

Finally, to launch and run an SEV-ES guest requires changes to the vCPU
initialization, loading and execution.

[1] https://www.amd.com/system/files/TechDocs/24593.pdf
[2] https://developer.amd.com/wp-content/resources/56421.pdf
---

These patches are based on a commit of the KVM next branch. However, I had
to backport recent SEV-ES guest patches (a previous series to the actual
patches that are now in the tip tree) into my development branch, since
there are prereq patches needed by this series. As a result, this patch
series will not successfully build or apply to the KVM next branch as is.

A version of the tree can be found at:
https://github.com/AMDESE/linux/tree/sev-es-5.8-v3

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Jim Mattson <jmattson@google.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Sean Christopherson <sean.j.christopherson@intel.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: Wanpeng Li <wanpengli@tencent.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Brijesh Singh <brijesh.singh@amd.com>

Tom Lendacky (35):
  KVM: SVM: Remove the call to sev_platform_status() during setup
  KVM: SVM: Add support for SEV-ES capability in KVM
  KVM: SVM: Add indirect access to the VM save area
  KVM: SVM: Make GHCB accessor functions available to the hypervisor
  KVM: SVM: Add initial support for SEV-ES GHCB access to KVM
  KVM: SVM: Add required changes to support intercepts under SEV-ES
  KVM: SVM: Modify DRx register intercepts for an SEV-ES guest
  KVM: SVM: Prevent debugging under SEV-ES
  KVM: SVM: Do not emulate MMIO under SEV-ES
  KVM: SVM: Cannot re-initialize the VMCB after shutdown with SEV-ES
  KVM: SVM: Prepare for SEV-ES exit handling in the sev.c file
  KVM: SVM: Add initial support for a VMGEXIT VMEXIT
  KVM: SVM: Create trace events for VMGEXIT processing
  KVM: SVM: Add support for SEV-ES GHCB MSR protocol function 0x002
  KVM: SVM: Add support for SEV-ES GHCB MSR protocol function 0x004
  KVM: SVM: Add support for SEV-ES GHCB MSR protocol function 0x100
  KVM: SVM: Create trace events for VMGEXIT MSR protocol processing
  KVM: SVM: Support MMIO for an SEV-ES guest
  KVM: SVM: Support port IO operations for an SEV-ES guest
  KVM: SVM: Add SEV/SEV-ES support for intercepting INVD
  KVM: SVM: Add support for EFER write traps for an SEV-ES guest
  KVM: SVM: Add support for CR0 write traps for an SEV-ES guest
  KVM: SVM: Add support for CR4 write traps for an SEV-ES guest
  KVM: SVM: Add support for CR8 write traps for an SEV-ES guest
  KVM: x86: Update __get_sregs() / __set_sregs() to support SEV-ES
  KVM: SVM: Guest FPU state save/restore not needed for SEV-ES guest
  KVM: SVM: Add support for booting APs for an SEV-ES guest
  KVM: X86: Update kvm_skip_emulated_instruction() for an SEV-ES guest
  KVM: SVM: Add NMI support for an SEV-ES guest
  KVM: SVM: Set the encryption mask for the SVM host save area
  KVM: SVM: Update ASID allocation to support SEV-ES guests
  KVM: SVM: Provide support for SEV-ES vCPU creation/loading
  KVM: SVM: Provide support for SEV-ES vCPU loading
  KVM: SVM: Provide an updated VMRUN invocation for SEV-ES guests
  KVM: SVM: Provide support to launch and run an SEV-ES guest

 arch/x86/include/asm/kvm_host.h  |  16 +
 arch/x86/include/asm/msr-index.h |   1 +
 arch/x86/include/asm/svm.h       |  35 +-
 arch/x86/include/uapi/asm/svm.h  |  28 ++
 arch/x86/kernel/cpu/vmware.c     |  12 +-
 arch/x86/kvm/Kconfig             |   3 +-
 arch/x86/kvm/cpuid.c             |   1 +
 arch/x86/kvm/kvm_cache_regs.h    |  30 +-
 arch/x86/kvm/mmu/mmu.c           |   7 +
 arch/x86/kvm/svm/nested.c        | 125 +++---
 arch/x86/kvm/svm/sev.c           | 590 ++++++++++++++++++++++++--
 arch/x86/kvm/svm/svm.c           | 704 ++++++++++++++++++++++++-------
 arch/x86/kvm/svm/svm.h           | 357 ++++++++++++++--
 arch/x86/kvm/svm/vmenter.S       |  50 +++
 arch/x86/kvm/trace.h             |  99 +++++
 arch/x86/kvm/vmx/vmx.c           |   7 +
 arch/x86/kvm/x86.c               | 357 ++++++++++++++--
 arch/x86/kvm/x86.h               |   8 +
 18 files changed, 2070 insertions(+), 360 deletions(-)
```


text:
"""A programmatic compiler of static assets."""
from __future__ import unicode_literals

import abc

from django.utils import six

from optimizations.assetcache import StaticAsset

class AssetCompilerPluginRegistrationError(Exception):

    """An error occured while registering asset compiler plugins."""

class AssetCompilerPluginBase(six.with_metaclass(abc.ABCMeta)):

    """Base class for asset compiler plugins."""

    asset_type = "various"

    @abc.abstractmethod
    def compile_assets(self, assets):
        """Compiles the given assets."""
        raise NotImplementedError

class AssetCompiler(object):

    """A programmatic compiler of static assets."""

    def __init__(self):
        """Initializes the asset compiler."""
        self._plugins = {}

    # Registration.

    def register_plugin(self, name, plugin):
        """Registers the given plugin with the asset compiler."""
        if name in self._plugins:
            raise AssetCompilerPluginRegistrationError("{name} is already registered with this asset compiler.".format(name=name))
        if not isinstance(plugin, AssetCompilerPluginBase):
            raise AssetCompilerPluginRegistrationError("{plugin} is not an instance of AssetCompilerPluginBase.".format(plugin=plugin))
        self._plugins[name] = plugin

    def unregister_plugin(self, name):
        """Unregisters the given plugin."""
        try:
            del self._plugins[name]
        except KeyError:
            raise AssetCompilerPluginRegistrationError("{name} is already registered with this asset compiler.".format(name=name))

    def has_plugin(self, name):
        """Tests whether the given plugin is registered with this asset compiler."""
        return name in self._plugins

    # Compilation.

    def compile_iter(self, namespace="default"):
        """Iterates over all assets in the given namespace, compiling as it goes."""
        for plugin_name, plugin in six.iteritems(self._plugins):
            assets = StaticAsset.load(plugin_name, namespace)
            plugin.compile_assets(assets)
            yield plugin, assets

    def compile(self, namespace="default"):
        """Compiles all assets in the given namespace."""
        return list(self.compile_iter(namespace))

# A shared, global asset compiler.
default_asset_compiler = AssetCompiler()


text:
<?php
use common\models\Option;
use xz1mefx\adminlte\helpers\Html;
use yii\grid\ActionColumn;
use yii\grid\GridView;
use yii\widgets\Pjax;

/* @var $this yii\web\View */
/* @var $searchModel backend\models\search\OptionSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = Yii::t('admin-side', 'Options');
$this->params['title'] = $this->title;
$this->params['breadcrumbs'][] = $this->title;
?>

        <?php if (Yii::$app->user->identity->userActivated): ?>
            <?= Html::a(Yii::t('admin-side', 'Create option'), ['create'], ['class' => 'btn btn-success']) ?>
        <?php else: ?>

        <?php endif; ?>

            <button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse">
                <?= Html::icon('minus', ['prefix' => 'fa fa-']) ?>
            </button>

            <?php Pjax::begin(); ?>
            <?= GridView::widget([
                'tableOptions' => ['class' => 'table table-striped table-bordered table-hover'],
                'dataProvider' => $dataProvider,
                'filterModel' => $searchModel,
                'columns' => [
                    [
                        'attribute' => 'parent_id',
                        'filter' => Option::getGroupDrDownList(),
                        'label' => $searchModel->getAttributeLabel('parentName'),
                        'headerOptions' => ['class' => 'col-md-1 col-sm-1'],
                        'contentOptions' => ['class' => 'col-md-1 col-sm-1'],
                        'content' => function ($model) {
                            /* @var $model Option */
                            return $model->parentName;
                        },
                    ],
                    'name:raw',
                    [
                        'attribute' => 'order',
                        'filter' => FALSE,
                        'headerOptions' => ['class' => 'col-md-1 col-sm-1'],
                        'contentOptions' => ['class' => 'col-md-1 col-sm-1'],
                    ],
                    'value',
//                  'status',
//                    'created_by',
//                    'updated_by',
//                    'created_at',
//                    'updated_at',

                    [
                        'class' => ActionColumn::className(),
                        'headerOptions' => ['class' => 'text-center col-xs-1 col-sm-1'],
                        'contentOptions' => ['class' => 'text-center col-xs-1 col-sm-1'],
                    ],
                ],
            ]); ?>
            <?php Pjax::end(); ?>


text:
#include "MainMenuWidget.h"
#include <optick.h>
#include <Graphics/Texture.h>
#include <Resource/ResourceCache.h>
#include <Utils/ImGuiUtils.h>
#include <Events/SceneEvents.h>
#include <Engine/Engine.h>
#include <Commands/EditorCommands.h>
#include <EditorApp.h>
#include <Havana.h>
#include <Utils/StringUtils.h>
#include <Utils/PlatformUtils.h>
#include <Events/HavanaEvents.h>
#include <Window/SDLWindow.h>
#include "UI/Colors.h"

#if ME_EDITOR

MainMenuWidget::MainMenuWidget(Havana* editorApp)
	: HavanaWidget("Main Menu")
	, Editor(editorApp)
{
}

void MainMenuWidget::Init()
{
	Icons["Close"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Close.png"));
	Icons["Maximize"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Maximize.png"));
	Icons["ExitMaximize"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/ExitMaximize.png"));
	Icons["Minimize"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Minimize.png"));

	Icons["Play"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Play.png"));
	Icons["Pause"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Pause.png"));
	Icons["Stop"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Stop.png"));

	Icons["BugReport"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/BugReport.png"));
	Icons["Info"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Info.png"));
	Icons["Logo"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/ME-LOGO.png"));
	Icons["Profiler"] = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Havana/UI/Profiler.png"));

	auto cb = [this](const Vector2& pos) -> std::optional<SDL_HitTestResult>
	{
		if (pos > TitleBarDragPosition && pos < TitleBarDragPosition + TitleBarDragSize)
		{
			return SDL_HitTestResult::SDL_HITTEST_DRAGGABLE;
		}

		return std::nullopt;
	};
	auto window = static_cast<SDLWindow*>(GetEngine().GetWindow());
	window->SetBorderless(true);
	window->SetCustomDragCallback(cb);
	//Vector2 pos = Editor->GetInput().GetMousePosition();
	//SDL_SetWindowGrab(window->WindowHandle, (pos > TitleBarDragPosition && pos < TitleBarDragPosition + TitleBarDragSize) ? SDL_TRUE : SDL_FALSE);
}

void MainMenuWidget::Destroy()
{
	Icons.clear();
}

void MainMenuWidget::SetData(std::vector<SharedPtr<HavanaWidget>>* widgetList, EditorApp* editorApp)
{
	WidgetList = widgetList;
	App = editorApp;
}

void MainMenuWidget::SetWindowTitle(const std::string& title)
{
	WindowTitle = title;
}

void MainMenuWidget::Update()
{
	//auto window = static_cast<SDLWindow*>(GetEngine().GetWindow());
	//window->SetBorderless(true);
	//window->SetCustomDragCallback(cb);
	//Vector2 pos = Editor->GetInput().GetMousePosition();
	//SDL_SetWindowGrab(window->WindowHandle, /*(pos > TitleBarDragPosition && pos < TitleBarDragPosition + TitleBarDragSize) ?*/ SDL_TRUE /*: SDL_FALSE*/);
}

void MainMenuWidget::Render()
{
	bool RequestLoadScene = false;
	bool RequestSaveScene = false;
	bool RequestSaveAsScene = false;

	auto& input = Editor->GetInput();
	if ((input.IsKeyDown(KeyCode::LeftControl) || input.IsKeyDown(KeyCode::RightControl))
		&& input.WasKeyPressed(KeyCode::O))
	{
		RequestLoadScene = true;
	}

	// Saving hotkeys
	if ((input.IsKeyDown(KeyCode::LeftControl) && input.IsKeyDown(KeyCode::LeftShift))
		&& input.WasKeyPressed(KeyCode::S))
	{
		RequestSaveAsScene = true;
	}
	else if (input.IsKeyDown(KeyCode::LeftControl)
		&& input.WasKeyPressed(KeyCode::S))
	{
		RequestSaveScene = true;
	}

	OPTICK_CATEGORY("Main Menu Bar", Optick::Category::Debug);
	ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 12.f));
	ImGui::PushStyleColor(ImGuiCol_MenuBarBg, COLOR_BACKGROUND_BORDER);
	if (ImGui::BeginMainMenuBar())
	{
		ImGui::PopStyleColor();
		ImGui::PopStyleVar(1);

		Input& editorInput = GetEngine().GetEditorInput();
		Input& gameInput = GetEngine().GetInput();

		MainMenuSize = ImGui::GetWindowSize();
		//MainMenuSize.y = 25.f;
		//ImGui::SetWindowSize(MainMenuSize);
		ImGui::Image(Icons["Logo"]->TexHandle, ImVec2(35, 35));
		if (ImGui::BeginMenu("File"))
		{
			if (ImGui::MenuItem("New Scene"))
			{

#if ME_PLATFORM_WIN64
				NewSceneEvent evt;
				evt.Queue();
#endif
			}
			if (ImGui::MenuItem("Open Scene", "Ctrl+O"))
			{
				RequestLoadScene = true;
			}

			if (ImGui::MenuItem("Save", "Ctrl+S"))
			{
				if (GetEngine().CurrentScene)
				{
					SaveSceneEvent evt;
					evt.Fire();
				}

			}
			if (ImGui::MenuItem("Save As..", "Ctrl+Shift+S"))
			{
				SaveSceneEvent evt;
				evt.SaveAs = true;
				evt.Fire();
			}
			ImGui::Separator();

			if (ImGui::MenuItem("Quit", "Alt+F4"))
			{
				GetEngine().Quit();
			}
			ImGui::EndMenu();
		}
		//if (ImGui::BeginMenu("Edit"))
		//{
		//	const bool canUndo = EditorCommands.CanUndo();

		//	if (ImGui::MenuItem("Undo", "CTRL+Z", false, canUndo))
		//	{
		//		EditorCommands.Undo();
		//	}

		//	const bool canRedo = EditorCommands.CanRedo();
		//	if (ImGui::MenuItem("Redo", "CTRL+Y", false, canRedo))
		//	{
		//		EditorCommands.Redo();
		//	}

		//	/*ImGui::Separator();
		//	if (ImGui::MenuItem("Cut", "CTRL+X")) {}
		//	if (ImGui::MenuItem("Copy", "CTRL+C")) {}
		//	if (ImGui::MenuItem("Paste", "CTRL+V")) {}*/
		//	ImGui::EndMenu();
		//}
		//if (ImGui::BeginMenu("Add"))
		//{
		//	if (ImGui::MenuItem("Entity"))
		//	{
		//		// The fuck is this garbage
		//		CreateEntity* cmd = new CreateEntity();
		//		EditorCommands.Push(cmd);

		//		AddComponentCommand* compCmd = new AddComponentCommand("Transform", cmd->Ent);
		//		EditorCommands.Push(compCmd);

		//		Transform* transform = static_cast<Transform*>(compCmd->GetComponent());
		//		transform->SetName("New Entity");
		//	}
		//	ImGui::EndMenu();
		//}

		if (ImGui::BeginMenu("View"))
		{
			if (WidgetList)
			{
				std::vector<SharedPtr<HavanaWidget>>& list = *WidgetList;
				for (auto& i : list)
				{
					if (i.get() != this && ImGui::MenuItem(i->Name.c_str(), i->Hotkey.c_str(), &i->IsOpen))
					{
					}
				}
			}
			ImGui::EndMenu();
		}

		if (ImGui::BeginMenu("Help"))
		{
			if (ImGui::MenuItem("Show ImGui Demo"))
			{
				ShowDemoWindow = !ShowDemoWindow;
			}
			ImGui::Separator();
			if (ImGui::MenuItem("About"))
			{
				ShowAboutWindow = true;
			}
			ImGui::EndMenu();
		}

		if (!App->IsGameRunning())
		{
			if (ImGui::ImageButton(Icons["Play"]->TexHandle, ImVec2(30.f, 30.f)) || editorInput.IsKeyDown(KeyCode::F5))
			{
				ImGui::SetWindowFocus("Game");
				StartGameFunc();
				gameInput.Resume();
				Editor->GetInput().Stop();
			}
		}

		if (App->IsGameRunning())
		{
			if (ImGui::ImageButton(Icons["Pause"]->TexHandle, ImVec2(30.f, 30.f)) || editorInput.IsKeyDown(KeyCode::F10))
			{
				gameInput.Pause();
				PauseGameFunc();
			}

			if (ImGui::ImageButton(Icons["Stop"]->TexHandle, ImVec2(30.f, 30.f)) || (editorInput.IsKeyDown(KeyCode::F5) && editorInput.IsKeyDown(KeyCode::LeftShift)))
			{
				MaximizeOnPlay = false;
				ClearInspectEvent evt;
				evt.Fire();
				StopGameFunc();
				gameInput.Stop();
				Editor->GetInput().Resume();
			}
		}

		const float endOfMenu = ImGui::GetCursorPosX();
		const float buttonWidth = 40.f;
		TitleBarDragPosition = Vector2(endOfMenu, 10.f);
		const float winWidth = ImGui::GetWindowWidth();
		TitleBarDragSize = Vector2(winWidth - endOfMenu - (buttonWidth * 5.f), MainMenuSize.y - 10.f);

		// Window Maximize
		{
			const Vector2 pos = editorInput.GetMousePosition();

			if (ImGui::IsMouseDoubleClicked(0) && (pos > TitleBarDragPosition && pos < TitleBarDragPosition + TitleBarDragSize))
			{
				GetEngine().GetWindow()->Maximize();
			}
		}

		static int frameCount = 0;
		static float frametime = 0.0f;
		//static std::vector<float> frames;
		//frames.resize(50, GetEngine().DeltaTime * 100);
		//if (frameCount > 15)
		//{
		//	frametime = GetEngine().DeltaTime;
		//	frameCount = 0;
		//}
		//else
		//{
		//}

		// increase the counter by one
		static int m_fpscount = 0;
		static int fps = 0;
		m_fpscount++;
		++frameCount;

		static float fpsTime = 0;
		fpsTime += GetEngine().DeltaTime;
		// one second elapsed? (= 1000 milliseconds)
		if (fpsTime >= 1.f)
		{
			frametime = GetEngine().DeltaTime;
			frameCount = 0;

			// save the current counter value to m_fps
			fps = m_fpscount;

			// reset the counter and the interval
			m_fpscount = 0;
			fpsTime -= 1.f;
		}

		ImGui::Text("%.1f ms", frametime * 1000.f);
		ImGui::Text("%.1f fps", static_cast<float>(fps));
		//ImGui::Text("%.1f fps", (float)ImGui::GetIO().Framerate);

		ImGui::SetCursorPosX((ImGui::GetWindowWidth() / 2.f) - (ImGui::CalcTextSize(WindowTitle.c_str()).x / 2.f));
		ImGui::Text(WindowTitle.c_str());

		ImGui::BeginGroup();
		ImGui::PushStyleColor(ImGuiCol_Button, static_cast<ImVec4>(ImColor::HSV(0.0f, 0.6f, 0.6f, 0.f)));
		ImGui::PushStyleColor(ImGuiCol_ButtonActive, static_cast<ImVec4>(ImColor::HSV(0.f, 0.8f, 0.8f, 0.f)));
		ImGui::SetCursorPosX(ImGui::GetWindowWidth() - (buttonWidth * 4.25f));
		if (ImGui::ImageButton(Icons["Profiler"]->TexHandle, ImVec2(30.f, 30.f)))
		{
			const Path optickPath = Path("Engine/Tools/Optick.exe");
			// additional information
			PlatformUtils::RunProcess(optickPath);
		}
		//if (ImGui::ImageButton(Icons["Info"]->TexHandle, ImVec2(30.f, 30.f)))
		//{
		//	if (m_engine->CurrentScene && !std::filesystem::exists(m_engine->CurrentScene->FilePath.FullPath))
		//	{
		//		ImGui::OpenPopup("help_popup");
		//	}
		//}

		//if (ImGui::BeginPopup("help_popup"))
		//{
		//	ImGui::Text("Components");
		//	ImGui::Separator();

		//	ComponentRegistry& reg = GetComponentRegistry();

		//	for (auto& thing : reg)
		//	{
		//		if (ImGui::Selectable(thing.first.c_str()))
		//		{
		//			if (SelectedEntity)
		//			{
		//				AddComponentCommand* compCmd = new AddComponentCommand(thing.first, SelectedEntity);
		//				EditorCommands.Push(compCmd);
		//			}
		//			if (SelectedTransform)
		//			{
		//				AddComponentCommand* compCmd = new AddComponentCommand(thing.first, SelectedTransform->Parent);
		//				EditorCommands.Push(compCmd);
		//			}
		//		}
		//	}
		//	ImGui::EndPopup();
		//}
		const float RightShift = 2.f;
//		ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ACCENT_GREEN);
//		ImGui::SetCursorPosX(ImGui::GetWindowWidth() - (buttonWidth * 4.f));
//		if (ImGui::ImageButton(Icons["BugReport"]->TexHandle, ImVec2(30.f, 30.f)))
//		{
//#if ME_PLATFORM_WIN64
//			ShellExecute(0, 0, L"https://github.com/wobbier/MitchEngine/issues", 0, 0, SW_SHOW);
//#endif
//		}
//		ImGui::PopStyleColor(1);

		ImGui::SetCursorPosX(ImGui::GetWindowWidth() - (buttonWidth * 3.f) + RightShift);
		if (ImGui::ImageButton(Icons["Minimize"]->TexHandle, ImVec2(30.f, 30.f)))
		{
			GetEngine().GetWindow()->Minimize();
		}

		if (GetEngine().GetWindow()->IsMaximized())
		{
			ImGui::SetCursorPosX(ImGui::GetWindowWidth() - (buttonWidth * 2.f) + RightShift);
			if (ImGui::ImageButton(Icons["ExitMaximize"]->TexHandle, ImVec2(30.f, 30.f)))
			{
				GetEngine().GetWindow()->ExitMaximize();
			}
		}
		else
		{
			ImGui::SetCursorPosX(ImGui::GetWindowWidth() - (buttonWidth * 2.f) + RightShift);
			if (ImGui::ImageButton(Icons["Maximize"]->TexHandle, ImVec2(30.f, 30.f)))
			{
				GetEngine().GetWindow()->Maximize();
			}
		}

		ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ACCENT_RED);
		ImGui::SetCursorPosX(ImGui::GetWindowWidth() - buttonWidth + RightShift);
		//ImGui::SameLine(0.f);
		if (ImGui::ImageButton(Icons["Close"]->TexHandle, ImVec2(30.f, 30.f)))
		{
			GetEngine().GetWindow()->Exit();
		}
		ImGui::PopStyleColor(3);
		ImGui::EndGroup();

		ImGui::EndMainMenuBar();
	}

	if (ShowAboutWindow)
	{
		ImGui::OpenPopup("About");
	}

	ImVec2 center = ImGui::GetMainViewport()->GetCenter();
	ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));

	if (ImGui::BeginPopupModal("About", &ShowAboutWindow, ImGuiWindowFlags_AlwaysAutoResize))
	{
		ImGui::Image(Icons["Logo"]->TexHandle, { 50.f, 50.f });
		ImGui::SameLine();
		ImGui::Text("\nA hobby game engine project for making simple games.\nMitch Andrews 2021\n");
		ImGui::Separator();
#ifdef FMOD_ENABLED
		ImGui::Text("FMOD is set up correctly!\n\n");
		if (!FMODImage)
		{
			FMODImage = ResourceCache::GetInstance().Get<Moonlight::Texture>(Path("Assets/Legal/FMOD.png"));
		}
#endif

#ifdef FMOD_ENABLED
		ImGui::Image(FMODImage->TexHandle, { 364.f, 96.f });
		ImGui::Text("\n");
#else
		ImGui::Text("FMOD is not enabled! Please refer to Engine/README.md for instructions.\n");
#endif
		ImGui::SetItemDefaultFocus();
		if (ImGui::Button("Awesome!", ImVec2(-1, 0))) { ShowAboutWindow = false; ImGui::CloseCurrentPopup(); }
		ImGui::EndPopup();
	}
#ifdef FMOD_ENABLED
	else
	{
		FMODImage = nullptr;
	}
#endif

	if (ShowDemoWindow)
	{
		ImGui::ShowDemoWindow(&ShowDemoWindow);
	}

	if (RequestLoadScene)
	{
		RequestAssetSelectionEvent evt([this](Path selectedAsset) {
			LoadSceneEvent evt;
			evt.Level = selectedAsset.LocalPath;
			evt.Fire();

			GetEngine().GetConfig().SetValue(std::string("CurrentScene"), selectedAsset.LocalPath);
			}, AssetType::Level);
		evt.Fire();
	}

	if (RequestSaveScene)
	{
		SaveSceneEvent evt;
		evt.Fire();
	}

	if (RequestSaveAsScene)
	{
		SaveSceneEvent evt;
		evt.SaveAs = true;
		evt.Fire();
	}
}

void MainMenuWidget::SetCallbacks(std::function<void()> StartGame, std::function<void()> PauseGame, std::function<void()> StopGame)
{
	StartGameFunc = StartGame;
	PauseGameFunc = PauseGame;
	StopGameFunc = StopGame;
}

#endif


text:
// Copyright 2014 Cubane Canada, Inc.  All rights reserved.
// See LICENSE for details.

/*---
info: >
    Promise throws TypeError when 'this' is constructed but unsettled promise
es6id: S25.4.3.1_A2.2_T1
author: Sam Mikes
description: Promise.call(new Promise()) throws TypeError
---*/

var p = new Promise(function() {});

assert.throws(TypeError, function () {
    Promise.call(p, function () {});
});


text:
<?php

include_once APPPATH . 'models/Monster.php';

/**
 * Class Pumpkinhead
 */
class Pumpkinhead extends Monster
{
	/**
	 * @var string
	 */
	protected $name = 'Pumpkinhead';

	/**
	 * @var string
	 */
	protected $type = 'Flora';

	/**
	 * @var string
	 */
	protected $habitat = 'Butterfly Wood';

	/**
	 * @var int
	 */
	protected $abs = 10;

	/**
	 * @var int
	 */
	protected $gilda = 12;

	/**
	 * @var array
	 */
	protected $weaknesses = array('Flame', 'Lightning');

	/**
	 * @var array
	 */
	protected $effective_weapons = array();

	/**
	 * @var array
	 */
	protected $ineffective_weapons = array();

	/**
	 * @var array
	 */
	protected $items_dropped = array('Antidote Drink');
}


text:
package geom

import "math"

const (
	// Epsilon could probably be smaller than this without
	// causing problems, but we're being overly cautious.
	ε = 1.0e-7
	// Inf is shorthand for math.MaxFloat64
	Inf = math.MaxFloat64
	// NegInf is shorthand for math.MaxFloat64 * -1
	NegInf = -math.MaxFloat64
)

// F64eq returns whether two input float64s have
// a lesser difference than epsilon.
func F64eq(f1, f2 float64) bool {
	return math.Abs(f1-f2) <= ε
}

// Credit to David Calhoun at StackOverflow
// http://stackoverflow.com/questions/18390266

// Round converts a float64 to an integer.
func Round(num float64) int {
	return int(num + math.Copysign(0.5, num))
}

// ToFixed converts a float64 to a float64
// with a limited number of decimal places
func ToFixed(num float64, precision int) float64 {
	output := math.Pow(10, float64(precision))
	return float64(Round(num*output)) / output
}

// End Credit


text:
module rl.utilities.services.validation {
	'use strict';

	import __test = rl.utilities.services.test;

	interface IMockValidationHandler {
		validate: Sinon.SinonSpy;
		errorMessage?: string | Sinon.SinonSpy;
		isActive?: Sinon.SinonSpy | boolean;
	}

	interface IMockNotification {
		error: Sinon.SinonSpy;
		warning: Sinon.SinonSpy;
	}

	describe('validation', () => {
		var validation: IValidationService;
		var notification: IMockNotification;

		beforeEach(() => {
			angular.mock.module(moduleName);

			notification = {
				error: sinon.spy(),
				warning: sinon.spy(),
			};

			__test.angularFixture.mock({
				notification: notification,
			});

			var services: any = __test.angularFixture.inject(factoryName);
			var validationFactory: IValidationServiceFactory = services[factoryName];
			validation = validationFactory.getInstance();
		});

		describe('validate', (): void => {
			it('should register a validation handler and use it to validate', (): void => {
				var handler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return true; }),
				};

				validation.registerValidationHandler(<any>handler);

				var isValid: boolean = validation.validate();

				sinon.assert.calledOnce(handler.validate);
				expect(isValid).to.be.true;
			});

			it('should notify using the handler error message if validation fails', (): void => {
				var handler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return false; }),
					errorMessage: 'error',
				};

				validation.registerValidationHandler(<any>handler);

				var isValid: boolean = validation.validate();

				sinon.assert.calledOnce(handler.validate);
				expect(isValid).to.be.false;
				sinon.assert.calledOnce(notification.warning);
				sinon.assert.calledWith(notification.warning, 'error');
			});

			it('should use the error notification instead of warning if notifyAsError is set to true', (): void => {
				var handler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return false; }),
					errorMessage: 'error',
				};

				validation.registerValidationHandler(<any>handler);
				validation.notifyAsError = true;

				validation.validate();

				sinon.assert.calledOnce(notification.error);
				sinon.assert.calledWith(notification.error, 'error');
			});

			it('should allow the handler to specify a function for returning the error message', (): void => {
				var handler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return false; }),
					errorMessage: sinon.spy((): string => { return 'error'; }),
				};

				validation.registerValidationHandler(<any>handler);

				validation.validate();

				sinon.assert.calledOnce(<Sinon.SinonSpy>handler.errorMessage);

				sinon.assert.calledOnce(notification.warning);
				sinon.assert.calledWith(notification.warning, 'error');
			});

			it('should handle multiple validators and only show the error of the first one to fail', (): void => {
				var firstValidHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return true; }),
				};
				var secondValidHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return true; }),
				};
				var firstFailingHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return false; }),
					errorMessage: 'error1',
				};
				var thirdValidHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return true; }),
				};
				var secondFailingHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return false; }),
					errorMessage: 'error2',
				};

				validation.registerValidationHandler(<any>firstValidHandler);
				validation.registerValidationHandler(<any>secondValidHandler);
				validation.registerValidationHandler(<any>firstFailingHandler);
				validation.registerValidationHandler(<any>thirdValidHandler);
				validation.registerValidationHandler(<any>secondFailingHandler);

				var isValid: boolean = validation.validate();

				sinon.assert.calledOnce(firstFailingHandler.validate);
				sinon.assert.calledOnce(secondValidHandler.validate);
				sinon.assert.calledOnce(firstFailingHandler.validate);
				// halt execution after the first failed validation check
				sinon.assert.notCalled(thirdValidHandler.validate);
				sinon.assert.notCalled(secondFailingHandler.validate);
				expect(isValid).to.be.false;

				sinon.assert.calledOnce(notification.warning);
				sinon.assert.calledWith(notification.warning, 'error1');
			});
		});

		describe('isActive', (): void => {
			it('should disable a validator if isActive is set to false', (): void => {
				var inactiveHandler: IMockValidationHandler = {
					validate: sinon.spy(),
					isActive: false,
				};

				validation.registerValidationHandler(<any>inactiveHandler);

				var isValid: boolean = validation.validate();

				sinon.assert.notCalled(inactiveHandler.validate);
				// defaults to true if no active validators
				expect(isValid).to.be.true;
			});

			it('should call isActive and disable the validator if the result is false', (): void => {
				var inactiveHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return false; }),
					isActive: sinon.spy((): boolean => { return false; }),
				};
				var activeHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return true; }),
					isActive: sinon.spy((): boolean => { return true; }),
				};

				validation.registerValidationHandler(<any>inactiveHandler);
				validation.registerValidationHandler(<any>activeHandler);

				var isValid: boolean = validation.validate();

				sinon.assert.calledOnce(<Sinon.SinonSpy>inactiveHandler.isActive);
				sinon.assert.notCalled(inactiveHandler.validate);
				sinon.assert.calledOnce(<Sinon.SinonSpy>activeHandler.isActive);
				sinon.assert.calledOnce(activeHandler.validate);
				expect(isValid).to.be.true;
			});
		});

		describe('unregister', (): void => {
			it('should return a function to unregister the validation handler', (): void => {
				var handlerToUnregister: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return false; }),
				};
				var activeHandler: IMockValidationHandler = {
					validate: sinon.spy((): boolean => { return true; }),
				};

				var unregister: IUnregisterFunction = validation.registerValidationHandler(<any>handlerToUnregister);
				validation.registerValidationHandler(<any>activeHandler);

				var isValid: boolean = validation.validate();

				expect(isValid).to.be.false;
				sinon.assert.calledOnce(handlerToUnregister.validate);
				sinon.assert.notCalled(activeHandler.validate);

				handlerToUnregister.validate.reset();
				activeHandler.validate.reset();

				unregister();

				isValid = validation.validate();

				expect(isValid).to.be.true;
				sinon.assert.notCalled(handlerToUnregister.validate);
				sinon.assert.calledOnce(activeHandler.validate);
			});
		});
	});
}


text:
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wikidot="http://www.wikidot.com/rss-namespace">

	<channel>
		<title>tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
		<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an</link>
		<description>Posts in the discussion thread "tsundere looking for sparring parners in both Animeversus and Billy versus Snake" - Yeah....</description>
				<copyright></copyright>
		<lastBuildDate>Sun, 10 Jul 2022 04:54:15 +0000</lastBuildDate>

					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-366727</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-366727</link>
				<description></description>
				<pubDate>Mon, 26 Jan 2009 08:41:14 +0000</pubDate>
				<wikidot:authorName>sebmagic</wikidot:authorName>				<wikidot:authorUserId>271527</wikidot:authorUserId>				<content:encoded>
					<![CDATA[

ok, will re-added tsundere on BvS today (AV list full for now)

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-366546</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-366546</link>
				<description></description>
				<pubDate>Mon, 26 Jan 2009 02:09:35 +0000</pubDate>
				<wikidot:authorName>tsundere</wikidot:authorName>								<content:encoded>
					<![CDATA[

Added Nemar and sebmagic.

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-363357</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-363357</link>
				<description></description>
				<pubDate>Thu, 22 Jan 2009 03:50:42 +0000</pubDate>
				<wikidot:authorName>sebmagic</wikidot:authorName>				<wikidot:authorUserId>271527</wikidot:authorUserId>				<content:encoded>
					<![CDATA[

sebmagic added tsundere on BvS

TSUNDERE, are you still around? you did not accept me yet.

Are you still taking some, or you are full?

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-363350</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-363350</link>
				<description></description>
				<pubDate>Thu, 22 Jan 2009 03:27:48 +0000</pubDate>
				<wikidot:authorName>Nemar</wikidot:authorName>								<content:encoded>
					<![CDATA[

Nemar added tsundere on BvS

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-363269</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-363269</link>
				<description></description>
				<pubDate>Thu, 22 Jan 2009 01:21:29 +0000</pubDate>
				<wikidot:authorName>tsundere</wikidot:authorName>								<content:encoded>
					<![CDATA[

added

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-362438</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-362438</link>
				<description></description>
				<pubDate>Wed, 21 Jan 2009 12:40:29 +0000</pubDate>
				<wikidot:authorName>unstoppable</wikidot:authorName>				<wikidot:authorUserId>121638</wikidot:authorUserId>				<content:encoded>
					<![CDATA[

UnstopX added tsundere in AV

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-362296</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-362296</link>
				<description></description>
				<pubDate>Wed, 21 Jan 2009 07:13:37 +0000</pubDate>
				<wikidot:authorName>shaqdow</wikidot:authorName>								<content:encoded>
					<![CDATA[

added thundere on both

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-362060</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-362060</link>
				<description></description>
				<pubDate>Wed, 21 Jan 2009 00:05:54 +0000</pubDate>
				<wikidot:authorName>tsundere</wikidot:authorName>								<content:encoded>
					<![CDATA[

Still looking for sparring partners on both.

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-356795</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-356795</link>
				<description></description>
				<pubDate>Thu, 15 Jan 2009 01:56:10 +0000</pubDate>
				<wikidot:authorName>tsundere</wikidot:authorName>								<content:encoded>
					<![CDATA[

All of the above added

- Unconfirmed Rivals -
 Zenovia (days remaining: 2)
 Nobdy (days remaining: 2)
 Whitehat (days remaining: 3)
 M Senshou (days remaining: 3)
 You've still got room - go make some friends!
 (Slots remaining: 3)

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-356347</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-356347</link>
				<description></description>
				<pubDate>Wed, 14 Jan 2009 17:24:27 +0000</pubDate>
				<wikidot:authorName>M Senshou</wikidot:authorName>								<content:encoded>
					<![CDATA[

M Senshou added tsundere at AV

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-356180</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-356180</link>
				<description></description>
				<pubDate>Wed, 14 Jan 2009 14:03:37 +0000</pubDate>
				<wikidot:authorName>Whitehat</wikidot:authorName>								<content:encoded>
					<![CDATA[

Whitehat added tsundere on both.

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-355765</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-355765</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 23:46:56 +0000</pubDate>
				<wikidot:authorName>Rabid Rob</wikidot:authorName>				<wikidot:authorUserId>261044</wikidot:authorUserId>				<content:encoded>
					<![CDATA[

Rabid Rob added tsundere in both BvS and AV!

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-355753</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-355753</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 23:26:04 +0000</pubDate>
				<wikidot:authorName>tsundere</wikidot:authorName>								<content:encoded>
					<![CDATA[

Above all added as appropriate - Still spots available

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-355656</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-355656</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 21:35:32 +0000</pubDate>
				<wikidot:authorName>kaktus143</wikidot:authorName>								<content:encoded>
					<![CDATA[

kaktus143 added tsundere on AV

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-355606</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-355606</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 20:46:46 +0000</pubDate>
				<wikidot:authorName>nobdy</wikidot:authorName>				<wikidot:authorUserId>267306</wikidot:authorUserId>				<content:encoded>
					<![CDATA[

Nobdy added tsundere on BvS.

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-355377</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-355377</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 16:22:13 +0000</pubDate>
				<wikidot:authorName>Abh Empire</wikidot:authorName>								<content:encoded>
					<![CDATA[

Abh Empire and kreatur added tsundere on both

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-355351</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-355351</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 15:54:27 +0000</pubDate>
				<wikidot:authorName>Zenovia</wikidot:authorName>								<content:encoded>
					<![CDATA[

Zenovia added tsundere in bvs

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-355198</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-355198</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 13:01:09 +0000</pubDate>
				<wikidot:authorName>EvilGaara</wikidot:authorName>				<wikidot:authorUserId>262527</wikidot:authorUserId>				<content:encoded>
					<![CDATA[

EvilGaara added tsundere on both

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-354828</guid>
				<title>Re: tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-354828</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 01:08:02 +0000</pubDate>
				<wikidot:authorName>defrag</wikidot:authorName>				<wikidot:authorUserId>266919</wikidot:authorUserId>				<content:encoded>
					<![CDATA[

Defrag added tsundere in bvs

				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://bvs.wikidot.com/forum/t-119579#post-354823</guid>
				<title>tsundere looking for sparring parners in both Animeversus and Billy versus Snake</title>
				<link>http://bvs.wikidot.com/forum/t-119579/tsundere-looking-for-sparring-parners-in-both-animeversus-an#post-354823</link>
				<description></description>
				<pubDate>Tue, 13 Jan 2009 00:59:21 +0000</pubDate>
				<wikidot:authorName>tsundere</wikidot:authorName>								<content:encoded>
					<![CDATA[

nick: tsundere

Animeversus:
 Not transmuted, level 31
 11 slots open

Billy versus Snake:
 Level 45 Jonin on Season 1
 26 slots open

				 	]]>
				</content:encoded>							</item>
				</channel>
</rss>


text:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <string name="welcome">Hurra, du bist hier! Der Tag ist gerettet - nutze die folgenden Tipps!</string>
  <string name="text_segment">Eine Textpassage wie diese bezeichnen wir als Textsegment. Starte jetzt mit deinen Übersetzungen durch!</string>
  <string name="tab_shortcut">Arriba, Arriba! Andale, Andale! Sei schneller als Speedy Gonzales. Springe mit TAB ins nächste Textsegment, sobald du fertig bist. Deine Änderungen werden automatisch gespeichert.</string>
  <string name="placeholder_lingochecks">Bazinga!</string>
  <string name="love">❤</string>
</resources>


text:
ACCEPTED

#### According to
Index Fungorum

#### Published in
null

#### Original name
Pleospora aegyptiaca Reichert

### Remarks
null