249 lines
34 KiB
JavaScript
249 lines
34 KiB
JavaScript
|
|
(function() {
|
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
|
var __module = nodeEnv ? module : {exports:{}};
|
|
var __filename = 'preview-scripts/tiledmap-optimize-resource/Script/TmoObjectGroup.js';
|
|
var __require = nodeEnv ? function (request) {
|
|
return cc.require(request);
|
|
} : function (request) {
|
|
return __quick_compile_project__.require(request, __filename);
|
|
};
|
|
function __define (exports, require, module) {
|
|
if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
|
|
cc._RF.push(module, '30e2eSQWDNKI69FbaYfN62j', 'TmoObjectGroup');
|
|
// Script/TmoObjectGroup.js
|
|
|
|
"use strict";
|
|
|
|
exports.__esModule = true;
|
|
exports["default"] = void 0;
|
|
|
|
// Learn cc.Class:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/class.html
|
|
// Learn Attribute:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
|
|
// Learn life-cycle callbacks:
|
|
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
|
|
var TmoSprite = require("./TmoSprite");
|
|
|
|
var _default = cc.Class({
|
|
"extends": cc.TiledObjectGroup,
|
|
_init: function _init(groupInfo, mapInfo, texGrids, tiledMap) {
|
|
var TiledMap = cc.TiledMap;
|
|
var TMXObjectType = TiledMap.TMXObjectType;
|
|
var Orientation = TiledMap.Orientation;
|
|
var StaggerAxis = TiledMap.StaggerAxis;
|
|
var TileFlag = TiledMap.TileFlag;
|
|
var FLIPPED_MASK = TileFlag.FLIPPED_MASK;
|
|
var FLAG_HORIZONTAL = TileFlag.HORIZONTAL;
|
|
var FLAG_VERTICAL = TileFlag.VERTICAL;
|
|
this._groupName = groupInfo.name;
|
|
this._positionOffset = groupInfo.offset;
|
|
this._mapInfo = mapInfo;
|
|
this._properties = groupInfo.getProperties();
|
|
this._offset = cc.v2(groupInfo.offset.x, -groupInfo.offset.y);
|
|
this._opacity = groupInfo._opacity;
|
|
var mapSize = mapInfo._mapSize;
|
|
var tileSize = mapInfo._tileSize;
|
|
var width = 0,
|
|
height = 0;
|
|
|
|
if (mapInfo.orientation === Orientation.HEX) {
|
|
if (mapInfo.getStaggerAxis() === StaggerAxis.STAGGERAXIS_X) {
|
|
height = tileSize.height * (mapSize.height + 0.5);
|
|
width = (tileSize.width + mapInfo.getHexSideLength()) * Math.floor(mapSize.width / 2) + tileSize.width * (mapSize.width % 2);
|
|
} else {
|
|
width = tileSize.width * (mapSize.width + 0.5);
|
|
height = (tileSize.height + mapInfo.getHexSideLength()) * Math.floor(mapSize.height / 2) + tileSize.height * (mapSize.height % 2);
|
|
}
|
|
} else if (mapInfo.orientation === Orientation.ISO) {
|
|
var wh = mapSize.width + mapSize.height;
|
|
width = tileSize.width * 0.5 * wh;
|
|
height = tileSize.height * 0.5 * wh;
|
|
} else {
|
|
width = mapSize.width * tileSize.width;
|
|
height = mapSize.height * tileSize.height;
|
|
}
|
|
|
|
this.node.setContentSize(width, height);
|
|
var leftTopX = width * this.node.anchorX;
|
|
var leftTopY = height * (1 - this.node.anchorY);
|
|
var objects = groupInfo._objects;
|
|
var aliveNodes = {}; // 生成映射Map { Texture2D: textureIndex }
|
|
|
|
var textureIndexMap = new Map();
|
|
var objectTextures = tiledMap.getObjectTextures();
|
|
objectTextures.forEach(function (texture, idx) {
|
|
return textureIndexMap.set(texture, idx);
|
|
});
|
|
|
|
for (var i = 0, l = objects.length; i < l; i++) {
|
|
var object = objects[i];
|
|
var objType = object.type;
|
|
object.offset = cc.v2(object.x, object.y);
|
|
var points = object.points || object.polylinePoints;
|
|
|
|
if (points) {
|
|
for (var pi = 0; pi < points.length; pi++) {
|
|
points[pi].y *= -1;
|
|
}
|
|
}
|
|
|
|
if (Orientation.ISO !== mapInfo.orientation) {
|
|
object.y = height - object.y;
|
|
} else {
|
|
var posIdxX = object.x / tileSize.height;
|
|
var posIdxY = object.y / tileSize.height;
|
|
object.x = tileSize.width * 0.5 * (mapSize.height + posIdxX - posIdxY);
|
|
object.y = tileSize.height * 0.5 * (mapSize.width + mapSize.height - posIdxX - posIdxY);
|
|
}
|
|
|
|
if (objType === TMXObjectType.TEXT) {
|
|
var textName = "text" + object.id;
|
|
aliveNodes[textName] = true;
|
|
var textNode = this.node.getChildByName(textName);
|
|
|
|
if (!textNode) {
|
|
textNode = new cc.Node();
|
|
}
|
|
|
|
textNode.active = object.visible;
|
|
textNode.anchorX = 0;
|
|
textNode.anchorY = 1;
|
|
textNode.angle = -object.rotation;
|
|
textNode.x = object.x - leftTopX;
|
|
textNode.y = object.y - leftTopY;
|
|
textNode.name = textName;
|
|
textNode.parent = this.node;
|
|
textNode.color = object.color;
|
|
textNode.opacity = this._opacity;
|
|
textNode.setSiblingIndex(i);
|
|
var label = textNode.getComponent(cc.Label);
|
|
|
|
if (!label) {
|
|
label = textNode.addComponent(cc.Label);
|
|
}
|
|
|
|
label.overflow = cc.Label.Overflow.SHRINK;
|
|
label.lineHeight = object.height;
|
|
label.string = object.text;
|
|
label.horizontalAlign = object.halign;
|
|
label.verticalAlign = object.valign;
|
|
label.fontSize = object.pixelsize;
|
|
textNode.width = object.width;
|
|
textNode.height = object.height;
|
|
}
|
|
|
|
if (objType === TMXObjectType.IMAGE) {
|
|
var gid = object.gid;
|
|
var grid = texGrids[(gid & FLIPPED_MASK) >>> 0];
|
|
if (!grid) continue;
|
|
var tileset = grid.tileset;
|
|
var imgName = "img" + object.id;
|
|
aliveNodes[imgName] = true;
|
|
var imgNode = this.node.getChildByName(imgName);
|
|
var imgWidth = object.width || grid.width;
|
|
var imgHeight = object.height || grid.height;
|
|
var tileOffsetX = tileset.tileOffset.x;
|
|
var tileOffsetY = tileset.tileOffset.y; // Delete image nodes implemented as private nodes
|
|
// Use cc.Node to implement node-level requirements
|
|
|
|
if (imgNode instanceof cc.PrivateNode) {
|
|
imgNode.removeFromParent();
|
|
imgNode.destroy();
|
|
imgNode = null;
|
|
}
|
|
|
|
if (!imgNode) {
|
|
imgNode = new cc.Node();
|
|
}
|
|
|
|
if (Orientation.ISO == mapInfo.orientation) {
|
|
imgNode.anchorX = 0.5 + tileOffsetX / imgWidth;
|
|
imgNode.anchorY = tileOffsetY / imgHeight;
|
|
} else {
|
|
imgNode.anchorX = tileOffsetX / imgWidth;
|
|
imgNode.anchorY = tileOffsetY / imgHeight;
|
|
}
|
|
|
|
imgNode.active = object.visible;
|
|
imgNode.angle = -object.rotation;
|
|
imgNode.x = object.x - leftTopX;
|
|
imgNode.y = object.y - leftTopY;
|
|
imgNode.name = imgName;
|
|
imgNode.parent = this.node;
|
|
imgNode.opacity = this._opacity;
|
|
imgNode.setSiblingIndex(i);
|
|
imgNode._tiledMap = tiledMap;
|
|
var sp = imgNode.getComponent(TmoSprite);
|
|
|
|
if (!sp) {
|
|
sp = imgNode.addComponent(TmoSprite);
|
|
}
|
|
|
|
var spf = sp.spriteFrame;
|
|
|
|
if (!spf) {
|
|
spf = new cc.SpriteFrame();
|
|
}
|
|
|
|
if ((gid & FLAG_HORIZONTAL) >>> 0) {
|
|
spf.setFlipX(true);
|
|
} else {
|
|
spf.setFlipX(false);
|
|
}
|
|
|
|
if ((gid & FLAG_VERTICAL) >>> 0) {
|
|
spf.setFlipY(true);
|
|
} else {
|
|
spf.setFlipY(false);
|
|
}
|
|
|
|
var sourceImage = grid.tileset.sourceImage;
|
|
spf.setTexture(sourceImage, cc.rect(grid));
|
|
sp.spriteFrame = spf;
|
|
sp.setVertsDirty(); // object group may has no width or height info
|
|
|
|
imgNode.width = imgWidth;
|
|
imgNode.height = imgHeight; // 收集图集 更新textureIndexMap
|
|
|
|
if (!textureIndexMap.has(sourceImage)) {
|
|
textureIndexMap.set(sourceImage, objectTextures.length);
|
|
objectTextures.push(sourceImage);
|
|
} // 设置textureIndex
|
|
|
|
|
|
var textureIndex = textureIndexMap.get(sourceImage);
|
|
sp.setTextureIdx(textureIndex + 1);
|
|
}
|
|
}
|
|
|
|
this._objects = objects; // destroy useless node
|
|
|
|
var children = this.node.children;
|
|
var uselessExp = /^(?:img|text)\d+$/;
|
|
|
|
for (var _i = 0, n = children.length; _i < n; _i++) {
|
|
var c = children[_i];
|
|
var cName = c._name;
|
|
var isUseless = uselessExp.test(cName);
|
|
if (isUseless && !aliveNodes[cName]) c.destroy();
|
|
}
|
|
}
|
|
});
|
|
|
|
exports["default"] = _default;
|
|
module.exports = exports["default"];
|
|
|
|
cc._RF.pop();
|
|
}
|
|
if (nodeEnv) {
|
|
__define(__module.exports, __require, __module);
|
|
}
|
|
else {
|
|
__quick_compile_project__.registerModuleFunc(__filename, function () {
|
|
__define(__module.exports, __require, __module);
|
|
});
|
|
}
|
|
})();
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhY2thZ2VzXFxUaWxlZE1hcE9wdGltaXplclxccmVzb3VyY2VcXFNjcmlwdFxcVG1vT2JqZWN0R3JvdXAuanMiXSwibmFtZXMiOlsiVG1vU3ByaXRlIiwicmVxdWlyZSIsImNjIiwiQ2xhc3MiLCJUaWxlZE9iamVjdEdyb3VwIiwiX2luaXQiLCJncm91cEluZm8iLCJtYXBJbmZvIiwidGV4R3JpZHMiLCJ0aWxlZE1hcCIsIlRpbGVkTWFwIiwiVE1YT2JqZWN0VHlwZSIsIk9yaWVudGF0aW9uIiwiU3RhZ2dlckF4aXMiLCJUaWxlRmxhZyIsIkZMSVBQRURfTUFTSyIsIkZMQUdfSE9SSVpPTlRBTCIsIkhPUklaT05UQUwiLCJGTEFHX1ZFUlRJQ0FMIiwiVkVSVElDQUwiLCJfZ3JvdXBOYW1lIiwibmFtZSIsIl9wb3NpdGlvbk9mZnNldCIsIm9mZnNldCIsIl9tYXBJbmZvIiwiX3Byb3BlcnRpZXMiLCJnZXRQcm9wZXJ0aWVzIiwiX29mZnNldCIsInYyIiwieCIsInkiLCJfb3BhY2l0eSIsIm1hcFNpemUiLCJfbWFwU2l6ZSIsInRpbGVTaXplIiwiX3RpbGVTaXplIiwid2lkdGgiLCJoZWlnaHQiLCJvcmllbnRhdGlvbiIsIkhFWCIsImdldFN0YWdnZXJBeGlzIiwiU1RBR0dFUkFYSVNfWCIsImdldEhleFNpZGVMZW5ndGgiLCJNYXRoIiwiZmxvb3IiLCJJU08iLCJ3aCIsIm5vZGUiLCJzZXRDb250ZW50U2l6ZSIsImxlZnRUb3BYIiwiYW5jaG9yWCIsImxlZnRUb3BZIiwiYW5jaG9yWSIsIm9iamVjdHMiLCJfb2JqZWN0cyIsImFsaXZlTm9kZXMiLCJ0ZXh0dXJlSW5kZXhNYXAiLCJNYXAiLCJvYmplY3RUZXh0dXJlcyIsImdldE9iamVjdFRleHR1cmVzIiwiZm9yRWFjaCIsInRleHR1cmUiLCJpZHgiLCJzZXQiLCJpIiwibCIsImxlbmd0aCIsIm9iamVjdCIsIm9ialR5cGUiLCJ0eXBlIiwicG9pbnRzIiwicG9seWxpbmVQb2ludHMiLCJwaSIsInBvc0lkeFgiLCJwb3NJZHhZIiwiVEVYVCIsInRleHROYW1lIiwiaWQiLCJ0ZXh0Tm9kZSIsImdldENoaWxkQnlOYW1lIiwiTm9kZSIsImFjdGl2ZSIsInZpc2libGUiLCJhbmdsZSIsInJvdGF0aW9uIiwicGFyZW50IiwiY29sb3IiLCJvcGFjaXR5Iiwic2V0U2libGluZ0luZGV4IiwibGFiZWwiLCJnZXRDb21wb25lbnQiLCJMYWJlbCIsImFkZENvbXBvbmVudCIsIm92ZXJmbG93IiwiT3ZlcmZsb3ciLCJTSFJJTksiLCJsaW5lSGVpZ2h0Iiwic3RyaW5nIiwidGV4dCIsImhvcml6b250YWxBbGlnbiIsImhhbGlnbiIsInZlcnRpY2FsQWxpZ24iLCJ2YWxpZ24iLCJmb250U2l6ZSIsInBpeGVsc2l6ZSIsIklNQUdFIiwiZ2lkIiwiZ3JpZCIsInRpbGVzZXQiLCJpbWdOYW1lIiwiaW1nTm9kZSIsImltZ1dpZHRoIiwiaW1nSGVpZ2h0IiwidGlsZU9mZnNldFgiLCJ0aWxlT2Zmc2V0IiwidGlsZU9mZnNldFkiLCJQcml2YXRlTm9kZSIsInJlbW92ZUZyb21QYXJlbnQiLCJkZXN0cm95IiwiX3RpbGVkTWFwIiwic3AiLCJzcGYiLCJzcHJpdGVGcmFtZSIsIlNwcml0ZUZyYW1lIiwic2V0RmxpcFgiLCJzZXRGbGlwWSIsInNvdXJjZUltYWdlIiwic2V0VGV4dHVyZSIsInJlY3QiLCJzZXRWZXJ0c0RpcnR5IiwiaGFzIiwicHVzaCIsInRleHR1cmVJbmRleCIsImdldCIsInNldFRleHR1cmVJZHgiLCJjaGlsZHJlbiIsInVzZWxlc3NFeHAiLCJuIiwiYyIsImNOYW1lIiwiX25hbWUiLCJpc1VzZWxlc3MiLCJ0ZXN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQU1BLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGFBQUQsQ0FBekI7O2VBRWVDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ3BCLGFBQVNELEVBQUUsQ0FBQ0UsZ0JBRFE7QUFH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QyxFQUFpRDtBQUM3QyxVQUFJMEUsQ0FBQyxHQUFHSCxRQUFRLENBQUN2RSxFQUFELENBQWhCO0FBQ0EsVUFBSTJFLEtBQUssR0FBR0QsQ0FBQyxDQUFDRSxLQUFkO0FBQ0EsVUFBSUMsU0FBUyxHQUFHTCxVQUFVLENBQUNNLElBQVgsQ0FBZ0JILEtBQWhCLENBQWhCO0FBQ0EsVUFBSUUsU0FBUyxJQUFJLENBQUN0RixVQUFVLENBQUNvRixLQUFELENBQTVCLEVBQXFDRCxDQUFDLENBQUNwQixPQUFGO0FBQ3hDO0FBRUo7QUEvTW1CLENBQVQiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIExlYXJuIGNjLkNsYXNzOlxyXG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9jbGFzcy5odG1sXHJcbi8vIExlYXJuIEF0dHJpYnV0ZTpcclxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvcmVmZXJlbmNlL2F0dHJpYnV0ZXMuaHRtbFxyXG4vLyBMZWFybiBsaWZlLWN5Y2xlIGNhbGxiYWNrczpcclxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvbGlmZS1jeWNsZS1jYWxsYmFja3MuaHRtbFxyXG5cclxuY29uc3QgVG1vU3ByaXRlID0gcmVxdWlyZShcIi4vVG1vU3ByaXRlXCIpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2MuQ2xhc3Moe1xyXG4gICAgZXh0ZW5kczogY2MuVGlsZWRPYmplY3RHcm91cCxcclxuXHJcbiAgICBfaW5pdChncm91cEluZm8sIG1hcEluZm8sIHRleEdyaWRzLCB0aWxlZE1hcCkge1xyXG4gICAgICAgIGNvbnN0IFRpbGVkTWFwID0gY2MuVGlsZWRNYXA7XHJcbiAgICAgICAgY29uc3QgVE1YT2JqZWN0VHlwZSA9IFRpbGVkTWFwLlRNWE9iamVjdFR5cGU7XHJcbiAgICAgICAgY29uc3QgT3JpZW50YXRpb24gPSBUaWxlZE1hcC5PcmllbnRhdGlvbjtcclxuICAgICAgICBjb25zdCBTdGFnZ2VyQXhpcyA9IFRpbGVkTWFwLlN0YWdnZXJBeGlzO1xyXG4gICAgICAgIGNvbnN0IFRpbGVGbGFnID0gVGlsZWRNYXAuVGlsZUZsYWc7XHJcbiAgICAgICAgY29uc3QgRkxJUFBFRF9NQVNLID0gVGlsZUZsYWcuRkxJUFBFRF9NQVNLO1xyXG4gICAgICAgIGNvbnN0IEZMQUdfSE9SSVpPTlRBTCA9IFRpbGVGbGFnLkhPUklaT05UQUw7XHJcbiAgICAgICAgY29uc3QgRkxBR19WRVJUSUNBTCA9IFRpbGVGbGFnLlZFUlRJQ0FMO1xyXG5cclxuICAgICAgICB0aGlzLl9ncm91cE5hbWUgPSBncm91cEluZm8ubmFtZTtcclxuICAgICAgICB0aGlzLl9wb3NpdGlvbk9mZnNldCA9IGdyb3VwSW5mby5vZmZzZXQ7XHJcbiAgICAgICAgdGhpcy5fbWFwSW5mbyA9IG1hcEluZm87XHJcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IGdyb3VwSW5mby5nZXRQcm9wZXJ0aWVzKCk7XHJcbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gY2MudjIoZ3JvdXBJbmZvLm9mZnNldC54LCAtZ3JvdXBJbmZvLm9mZnNldC55KTtcclxuICAgICAgICB0aGlzLl9vcGFjaXR5ID0gZ3JvdXBJbmZvLl9vcGFjaXR5O1xyXG5cclxuICAgICAgICBsZXQgbWFwU2l6ZSA9IG1hcEluZm8uX21hcFNpemU7XHJcbiAgICAgICAgbGV0IHRpbGVTaXplID0gbWFwSW5mby5fdGlsZVNpemU7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDtcclxuICAgICAgICBpZiAobWFwSW5mby5vcmllbnRhdGlvbiA9PT0gT3JpZW50YXRpb24uSEVYKSB7XHJcbiAgICAgICAgICAgIGlmIChtYXBJbmZvLmdldFN0YWdnZXJBeGlzKCkgPT09IFN0YWdnZXJBeGlzLlNUQUdHRVJBWElTX1gpIHtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRpbGVTaXplLmhlaWdodCAqIChtYXBTaXplLmhlaWdodCArIDAuNSk7XHJcbiAgICAgICAgICAgICAgICB3aWR0aCA9ICh0aWxlU2l6ZS53aWR0aCArIG1hcEluZm8uZ2V0SGV4U2lkZUxlbmd0aCgpKSAqIE1hdGguZmxvb3IobWFwU2l6ZS53aWR0aCAvIDIpICsgdGlsZVNpemUud2lkdGggKiAobWFwU2l6ZS53aWR0aCAlIDIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSB0aWxlU2l6ZS53aWR0aCAqIChtYXBTaXplLndpZHRoICsgMC41KTtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9ICh0aWxlU2l6ZS5oZWlnaHQgKyBtYXBJbmZvLmdldEhleFNpZGVMZW5ndGgoKSkgKiBNYXRoLmZsb29yKG1hcFNpemUuaGVpZ2h0IC8gMikgKyB0aWxlU2l6ZS5oZWlnaHQgKiAobWFwU2l6ZS5oZWlnaHQgJSAyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAobWFwSW5mby5vcmllbnRhdGlvbiA9PT0gT3JpZW50YXRpb24uSVNPKSB7XHJcbiAgICAgICAgICAgIGxldCB3aCA9IG1hcFNpemUud2lkdGggKyBtYXBTaXplLmhlaWdodDtcclxuICAgICAgICAgICAgd2lkdGggPSB0aWxlU2l6ZS53aWR0aCAqIDAuNSAqIHdoO1xyXG4gICAgICAgICAgICBoZWlnaHQgPSB0aWxlU2l6ZS5oZWlnaHQgKiAwLjUgKiB3aDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB3aWR0aCA9IG1hcFNpemUud2lkdGggKiB0aWxlU2l6ZS53aWR0aDtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gbWFwU2l6ZS5oZWlnaHQgKiB0aWxlU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm9kZS5zZXRDb250ZW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnRUb3BYID0gd2lkdGggKiB0aGlzLm5vZGUuYW5jaG9yWDtcclxuICAgICAgICBsZXQgbGVmdFRvcFkgPSBoZWlnaHQgKiAoMSAtIHRoaXMubm9kZS5hbmNob3JZKTtcclxuXHJcbiAgICAgICAgbGV0IG9iamVjdHMgPSBncm91cEluZm8uX29iamVjdHM7XHJcbiAgICAgICAgbGV0IGFsaXZlTm9kZXMgPSB7fTtcclxuXHJcbiAgICAgICAgLy8g55Sf5oiQ5pig5bCETWFwICAgeyBUZXh0dXJlMkQ6IHRleHR1cmVJbmRleCB9XHJcbiAgICAgICAgbGV0IHRleHR1cmVJbmRleE1hcCA9IG5ldyBNYXAoKTtcclxuICAgICAgICBsZXQgb2JqZWN0VGV4dHVyZXMgPSB0aWxlZE1hcC5nZXRPYmplY3RUZXh0dXJlcygpO1xyXG4gICAgICAgIG9iamVjdFRleHR1cmVzLmZvckVhY2goKHRleHR1cmUsIGlkeCkgPT4gdGV4dHVyZUluZGV4TWFwLnNldCh0ZXh0dXJlLCBpZHgpKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgb2JqZWN0ID0gb2JqZWN0c1tpXTtcclxuICAgICAgICAgICAgbGV0IG9ialR5cGUgPSBvYmplY3QudHlwZTtcclxuICAgICAgICAgICAgb2JqZWN0Lm9mZnNldCA9IGNjLnYyKG9iamVjdC54LCBvYmplY3QueSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gb2JqZWN0LnBvaW50cyB8fCBvYmplY3QucG9seWxpbmVQb2ludHM7XHJcbiAgICAgICAgICAgIGlmIChwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHBpID0gMDsgcGkgPCBwb2ludHMubGVuZ3RoOyBwaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzW3BpXS55ICo9IC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoT3JpZW50YXRpb24uSVNPICE9PSBtYXBJbmZvLm9yaWVudGF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3QueSA9IGhlaWdodCAtIG9iamVjdC55O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvc0lkeFggPSBvYmplY3QueCAvIHRpbGVTaXplLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIGxldCBwb3NJZHhZID0gb2JqZWN0LnkgLyB0aWxlU2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBvYmplY3QueCA9IHRpbGVTaXplLndpZHRoICogMC41ICogKG1hcFNpemUuaGVpZ2h0ICsgcG9zSWR4WCAtIHBvc0lkeFkpO1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0LnkgPSB0aWxlU2l6ZS5oZWlnaHQgKiAwLjUgKiAobWFwU2l6ZS53aWR0aCArIG1hcFNpemUuaGVpZ2h0IC0gcG9zSWR4WCAtIHBvc0lkeFkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob2JqVHlwZSA9PT0gVE1YT2JqZWN0VHlwZS5URVhUKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGV4dE5hbWUgPSBcInRleHRcIiArIG9iamVjdC5pZDtcclxuICAgICAgICAgICAgICAgIGFsaXZlTm9kZXNbdGV4dE5hbWVdID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdGV4dE5vZGUgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUodGV4dE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHROb2RlID0gbmV3IGNjLk5vZGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZS5hY3RpdmUgPSBvYmplY3QudmlzaWJsZTtcclxuICAgICAgICAgICAgICAgIHRleHROb2RlLmFuY2hvclggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGV4dE5vZGUuYW5jaG9yWSA9IDE7XHJcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZS5hbmdsZSA9IC1vYmplY3Qucm90YXRpb247XHJcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZS54ID0gb2JqZWN0LnggLSBsZWZ0VG9wWDtcclxuICAgICAgICAgICAgICAgIHRleHROb2RlLnkgPSBvYmplY3QueSAtIGxlZnRUb3BZO1xyXG4gICAgICAgICAgICAgICAgdGV4dE5vZGUubmFtZSA9IHRleHROYW1lO1xyXG4gICAgICAgICAgICAgICAgdGV4dE5vZGUucGFyZW50ID0gdGhpcy5ub2RlO1xyXG4gICAgICAgICAgICAgICAgdGV4dE5vZGUuY29sb3IgPSBvYmplY3QuY29sb3I7XHJcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZS5vcGFjaXR5ID0gdGhpcy5fb3BhY2l0eTtcclxuICAgICAgICAgICAgICAgIHRleHROb2RlLnNldFNpYmxpbmdJbmRleChpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSB0ZXh0Tm9kZS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdGV4dE5vZGUuYWRkQ29tcG9uZW50KGNjLkxhYmVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsYWJlbC5vdmVyZmxvdyA9IGNjLkxhYmVsLk92ZXJmbG93LlNIUklOSztcclxuICAgICAgICAgICAgICAgIGxhYmVsLmxpbmVIZWlnaHQgPSBvYmplY3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgbGFiZWwuc3RyaW5nID0gb2JqZWN0LnRleHQ7XHJcbiAgICAgICAgICAgICAgICBsYWJlbC5ob3Jpem9udGFsQWxpZ24gPSBvYmplY3QuaGFsaWduO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwudmVydGljYWxBbGlnbiA9IG9iamVjdC52YWxpZ247XHJcbiAgICAgICAgICAgICAgICBsYWJlbC5mb250U2l6ZSA9IG9iamVjdC5waXhlbHNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGV4dE5vZGUud2lkdGggPSBvYmplY3Qud2lkdGg7XHJcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZS5oZWlnaHQgPSBvYmplY3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob2JqVHlwZSA9PT0gVE1YT2JqZWN0VHlwZS5JTUFHRSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGdpZCA9IG9iamVjdC5naWQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JpZCA9IHRleEdyaWRzWyhnaWQgJiBGTElQUEVEX01BU0spID4+PiAwXTtcclxuICAgICAgICAgICAgICAgIGlmICghZ3JpZCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGlsZXNldCA9IGdyaWQudGlsZXNldDtcclxuICAgICAgICAgICAgICAgIGxldCBpbWdOYW1lID0gXCJpbWdcIiArIG9iamVjdC5pZDtcclxuICAgICAgICAgICAgICAgIGFsaXZlTm9kZXNbaW1nTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGltZ05vZGUgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoaW1nTmFtZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1nV2lkdGggPSBvYmplY3Qud2lkdGggfHwgZ3JpZC53aWR0aDtcclxuICAgICAgICAgICAgICAgIGxldCBpbWdIZWlnaHQgPSBvYmplY3QuaGVpZ2h0IHx8IGdyaWQuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgbGV0IHRpbGVPZmZzZXRYID0gdGlsZXNldC50aWxlT2Zmc2V0Lng7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGlsZU9mZnNldFkgPSB0aWxlc2V0LnRpbGVPZmZzZXQueTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBEZWxldGUgaW1hZ2Ugbm9kZXMgaW1wbGVtZW50ZWQgYXMgcHJpdmF0ZSBub2Rlc1xyXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNjLk5vZGUgdG8gaW1wbGVtZW50IG5vZGUtbGV2ZWwgcmVxdWlyZW1lbnRzXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1nTm9kZSBpbnN0YW5jZW9mIGNjLlByaXZhdGVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nTm9kZS5yZW1vdmVGcm9tUGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nTm9kZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFpbWdOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nTm9kZSA9IG5ldyBjYy5Ob2RlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKE9yaWVudGF0aW9uLklTTyA9PSBtYXBJbmZvLm9yaWVudGF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nTm9kZS5hbmNob3JYID0gMC41ICsgdGlsZU9mZnNldFggLyBpbWdXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBpbWdOb2RlLmFuY2hvclkgPSB0aWxlT2Zmc2V0WSAvIGltZ0hlaWdodDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nTm9kZS5hbmNob3JYID0gdGlsZU9mZnNldFggLyBpbWdXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBpbWdOb2RlLmFuY2hvclkgPSB0aWxlT2Zmc2V0WSAvIGltZ0hlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGltZ05vZGUuYWN0aXZlID0gb2JqZWN0LnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICBpbWdOb2RlLmFuZ2xlID0gLW9iamVjdC5yb3RhdGlvbjtcclxuICAgICAgICAgICAgICAgIGltZ05vZGUueCA9IG9iamVjdC54IC0gbGVmdFRvcFg7XHJcbiAgICAgICAgICAgICAgICBpbWdOb2RlLnkgPSBvYmplY3QueSAtIGxlZnRUb3BZO1xyXG4gICAgICAgICAgICAgICAgaW1nTm9kZS5uYW1lID0gaW1nTmFtZTtcclxuICAgICAgICAgICAgICAgIGltZ05vZGUucGFyZW50ID0gdGhpcy5ub2RlO1xyXG4gICAgICAgICAgICAgICAgaW1nTm9kZS5vcGFjaXR5ID0gdGhpcy5fb3BhY2l0eTtcclxuICAgICAgICAgICAgICAgIGltZ05vZGUuc2V0U2libGluZ0luZGV4KGkpO1xyXG4gICAgICAgICAgICAgICAgaW1nTm9kZS5fdGlsZWRNYXAgPSB0aWxlZE1hcDtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHNwID0gaW1nTm9kZS5nZXRDb21wb25lbnQoVG1vU3ByaXRlKTtcclxuICAgICAgICAgICAgICAgIGlmICghc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBzcCA9IGltZ05vZGUuYWRkQ29tcG9uZW50KFRtb1Nwcml0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc3BmID0gc3Auc3ByaXRlRnJhbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNwZikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNwZiA9IG5ldyBjYy5TcHJpdGVGcmFtZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICgoZ2lkICYgRkxBR19IT1JJWk9OVEFMKSA+Pj4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNwZi5zZXRGbGlwWCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BmLnNldEZsaXBYKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoKGdpZCAmIEZMQUdfVkVSVElDQUwpID4+PiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BmLnNldEZsaXBZKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzcGYuc2V0RmxpcFkoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBzb3VyY2VJbWFnZSA9IGdyaWQudGlsZXNldC5zb3VyY2VJbWFnZTtcclxuICAgICAgICAgICAgICAgIHNwZi5zZXRUZXh0dXJlKHNvdXJjZUltYWdlLCBjYy5yZWN0KGdyaWQpKTtcclxuICAgICAgICAgICAgICAgIHNwLnNwcml0ZUZyYW1lID0gc3BmO1xyXG4gICAgICAgICAgICAgICAgc3Auc2V0VmVydHNEaXJ0eSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIG9iamVjdCBncm91cCBtYXkgaGFzIG5vIHdpZHRoIG9yIGhlaWdodCBpbmZvXHJcbiAgICAgICAgICAgICAgICBpbWdOb2RlLndpZHRoID0gaW1nV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBpbWdOb2RlLmhlaWdodCA9IGltZ0hlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDmlLbpm4blm77pm4Yg5pu05pawdGV4dHVyZUluZGV4TWFwXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRleHR1cmVJbmRleE1hcC5oYXMoc291cmNlSW1hZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZUluZGV4TWFwLnNldChzb3VyY2VJbWFnZSwgb2JqZWN0VGV4dHVyZXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RUZXh0dXJlcy5wdXNoKHNvdXJjZUltYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyDorr7nva50ZXh0dXJlSW5kZXhcclxuICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlSW5kZXggPSB0ZXh0dXJlSW5kZXhNYXAuZ2V0KHNvdXJjZUltYWdlKTtcclxuICAgICAgICAgICAgICAgIHNwLnNldFRleHR1cmVJZHgodGV4dHVyZUluZGV4ICsgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fb2JqZWN0cyA9IG9iamVjdHM7XHJcblxyXG5cclxuICAgICAgICAvLyBkZXN0cm95IHVzZWxlc3Mgbm9kZVxyXG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMubm9kZS5jaGlsZHJlbjtcclxuICAgICAgICBsZXQgdXNlbGVzc0V4cCA9IC9eKD86aW1nfHRleHQpXFxkKyQvO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGxldCBjTmFtZSA9IGMuX25hbWU7XHJcbiAgICAgICAgICAgIGxldCBpc1VzZWxlc3MgPSB1c2VsZXNzRXhwLnRlc3QoY05hbWUpO1xyXG4gICAgICAgICAgICBpZiAoaXNVc2VsZXNzICYmICFhbGl2ZU5vZGVzW2NOYW1lXSkgYy5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSk7XHJcbiJdfQ==
|